微信怎么设计分享网站,网站建设必须买主机吗,大淘客网站建设app,wordpress 地址 .html抽象工厂模式是一种创建型设计模式#xff0c;它提供了一种在不指定具体产品类的情况下创建一系列相关或依赖对象的方法。
抽象工厂模式分为四个角色#xff1a;抽象工厂、具体工厂、抽象产品、具体产品。
抽象工厂和工厂方法其实很类似#xff0c;但也有一定的区别#…抽象工厂模式是一种创建型设计模式它提供了一种在不指定具体产品类的情况下创建一系列相关或依赖对象的方法。
抽象工厂模式分为四个角色抽象工厂、具体工厂、抽象产品、具体产品。
抽象工厂和工厂方法其实很类似但也有一定的区别 抽象工厂模式关注一系列产品对象的创建 工厂方法模式关注单个产品对象的创建
举例 假设我们有两个产品族手机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_ptrPhone CreatePhone() 0;virtual std::shared_ptrLaptop CreateLaptop() 0;
};// 华为工厂-具体工厂
class HuaWeiFactory: public AbstractFactory
{
public:virtual std::shared_ptrPhone CreatePhone() override{return std::make_sharedHuaWeiPhone();}virtual std::shared_ptrLaptop CreateLaptop() override{return std::make_sharedHuaWeiLaptop();}
};// 苹果工厂-具体工厂
class AppleFactory: public AbstractFactory
{
public:virtual std::shared_ptrPhone CreatePhone() override{return std::make_sharedApplePhone();}virtual std::shared_ptrLaptop CreateLaptop() override{return std::make_sharedAppleLaptop();}
};测试
void TestAbstractFactory()
{// 创建苹果工厂std::shared_ptrAbstractFactory apple_factory std::make_sharedAppleFactory();// 创建华为工厂std::shared_ptrAbstractFactory huawei_factory std::make_sharedHuaWeiFactory();// 通过苹果工厂创建苹果电脑和苹果手机std::shared_ptrPhone apple_phone apple_factory-CreatePhone();std::shared_ptrLaptop apple_laptop apple_factory-CreateLaptop();// 通过华为工厂创建华为电脑和华为手机std::shared_ptrPhone huawei_phone huawei_factory-CreatePhone();std::shared_ptrLaptop huawei_laptop huawei_factory-CreateLaptop();// 使用苹果电脑和手机apple_phone-MakeCall();apple_laptop-PlayGame();// 使用华为电脑和手机huawei_phone-MakeCall();huawei_laptop-PlayGame();
}输出
苹果手机打电话
苹果电脑玩游戏
华为手机打电话
华为电脑玩游戏我们通过抽象工厂接口创建了一个苹果工厂和华为工厂又通过华为工厂接口创建了华为电脑和华为手机苹果同理这样的话我们就可以使用华为电脑和手机。
通过这种方式我们就绕开了new的方式去创建对象。
抽象工厂遵循的设计原则
依赖倒置原则通过引入抽象接口实现了具体产品的实现细节与客户端代码测试代码或使用代码的解耦。客户端只需要通过抽象接口创建对象不需要关心具体的产品类。这样就是实现了高层模块客户端代码依赖抽象接口而不依赖具体的低层模块具体的产品实现。开放封闭原则通过引入抽象接口允许添加工厂和产品而不需要修改已有代码实现了对扩展开放、对修改关闭。单一职责原则抽象工厂模式将产品的创建封装在具体工厂类中每个工厂又负责创建特定的产品族使得每一个类只有一个职责。接口隔离原则通过引入抽象接口将产品对象的创建方法和具体的实现细节隔离开客户端代码不需要关心具体产品的实现只需要和抽象接口进行交互避免了对不需要的方法进行依赖。
抽象工厂模式适用于以下场景
系统需要独立于它的产品的创建、组合和表示时系统需要一组相关产品对象并且希望统一地对待它们系统需要在运行时切换不同的产品族
抽象工厂模式的优点
将客户端代码于具体产品的实现进行解耦使客户端可以灵活应用各种产品。
缺点
增加新的产品族比较困难需要修改抽象工厂的接口当创建的产品只有一个时退化成工厂方法模式