抽象工厂模式是一种创建型设计模式,它提供了一种在不指定具体产品类的情况下创建一系列相关或依赖对象的方法。
抽象工厂模式分为四个角色:抽象工厂、具体工厂、抽象产品、具体产品。
抽象工厂和工厂方法其实很类似,但也有一定的区别:
抽象工厂模式关注一系列产品对象的创建
工厂方法模式关注单个产品对象的创建
举例:
假设我们有两个产品族:手机(Phone)和电脑(Laptop),它们有不同的型号:苹果(Apple)和华为(HuaWei)。
// 手机接口-抽象产品
class Phone
{
public:
virtual ~Phone() {}
virtual void MakeCall() = 0;
};
// 电脑接口-抽象产品
class Laptop
{
public:
virtual ~Laptop() {}
virtual void PlayGame() = 0;
};
// 华为手机-具体产品
class HuaWeiPhone
: public Phone
{
public:
virtual void MakeCall() override
{
std::cout << "华为手机打电话" << std::endl;
}
};
// 华为电脑-具体产品
class HuaWeiLaptop
: public Laptop
{
public:
virtual void PlayGame() override
{
std::cout << "华为电脑玩游戏" << std::endl;
}
};
// 苹果手机-具体产品
class ApplePhone
: public Phone
{
public:
virtual void MakeCall() override
{
std::cout << "苹果手机打电话" << std::endl;
}
};
// 苹果电脑-具体产品
class AppleLaptop
: public Laptop
{
public:
virtual void PlayGame() override
{
std::cout << "苹果电脑玩游戏" << std::endl;
}
};
// 抽象工厂
class AbstractFactory
{
public:
virtual ~AbstractFactory() {}
virtual std::shared_ptr<Phone> CreatePhone() = 0;
virtual std::shared_ptr<Laptop> CreateLaptop() = 0;
};
// 华为工厂-具体工厂
class HuaWeiFactory
: public AbstractFactory
{
public:
virtual std::shared_ptr<Phone> CreatePhone() override
{
return std::make_shared<HuaWeiPhone>();
}
virtual std::shared_ptr<Laptop> CreateLaptop() override
{
return std::make_shared<HuaWeiLaptop>();
}
};
// 苹果工厂-具体工厂
class AppleFactory
: public AbstractFactory
{
public:
virtual std::shared_ptr<Phone> CreatePhone() override
{
return std::make_shared<ApplePhone>();
}
virtual std::shared_ptr<Laptop> CreateLaptop() override
{
return std::make_shared<AppleLaptop>();
}
};
测试
void TestAbstractFactory()
{
// 创建苹果工厂
std::shared_ptr<AbstractFactory> apple_factory = std::make_shared<AppleFactory>();
// 创建华为工厂
std::shared_ptr<AbstractFactory> huawei_factory = std::make_shared<HuaWeiFactory>();
// 通过苹果工厂创建苹果电脑和苹果手机
std::shared_ptr<Phone> apple_phone = apple_factory->CreatePhone();
std::shared_ptr<Laptop> apple_laptop = apple_factory->CreateLaptop();
// 通过华为工厂创建华为电脑和华为手机
std::shared_ptr<Phone> huawei_phone = huawei_factory->CreatePhone();
std::shared_ptr<Laptop> huawei_laptop = huawei_factory->CreateLaptop();
// 使用苹果电脑和手机
apple_phone->MakeCall();
apple_laptop->PlayGame();
// 使用华为电脑和手机
huawei_phone->MakeCall();
huawei_laptop->PlayGame();
}
输出:
苹果手机打电话
苹果电脑玩游戏
华为手机打电话
华为电脑玩游戏
我们通过抽象工厂接口创建了一个苹果工厂和华为工厂,又通过华为工厂接口创建了华为电脑和华为手机(苹果同理),这样的话我们就可以使用华为电脑和手机。
通过这种方式,我们就绕开了new的方式去创建对象。
抽象工厂遵循的设计原则:
抽象工厂模式适用于以下场景:
抽象工厂模式的优点:
缺点: