简单工厂模式
简述
简单工厂模式 又叫 静态工厂方法模式,属于创建型模式。简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类的实例。
模式结构
工厂: 整个模式的核心,负责实现创建所有实例的内部逻辑。
抽象产品:所有具体产品的父类,负责描述所有实例所共有的公共接口。
具体产品:最终创建的具体产品
优缺点
优点:
- 工厂类包含了必要的逻辑判断,根据指定的信息来创建对应的产品。客户端仅负责“消费”产品即可,实现了对象创建和使用的分离。
- 客户端无需关心具体产品如何创建与组织,仅需知道具体产品所对应的参数即可,可以在一定程度减少使用者的记忆量。
缺点:
- 由于工厂类集中了所有产品的创建逻辑(违反了高内聚责任分配原则),职责过重,一旦无法正常工作,整个系统都将受到影响。
- 一旦添加新产品就不得不修改工厂逻辑,在产品类型较多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展和维护。
这些缺点在
C++工厂方法模式 中得到了一定的克服。
案例:
互联网行业有三巨头 BAT,汽车界也有三大豪门 BBA - 奔驰、宝马、奥迪。他们是驰名世界的汽车企业,也被认为是高档汽车生产的先导,最可怕的是均属于德国制造。奔驰优雅稳重、宝马操控感强、奥迪大气,更是官车的代表。。。“坐奔驰,开宝马”,足以说明一切。在国内,BBA 大受欢迎,对很多人来说,不仅是代步工具,更是身份的象征。
代码实现
/*头文件*/ #include <iostream> enum CARTYPE { BEN_CHI = 0, BAO_MA = 1, AO_DI =2 }; //产品抽象类 class ICar { public: virtual void carName() = 0; }; /*源文件*/ #include "SimpleFactory.h" //具体产品类 class BenzCar : public ICar { public: virtual void carName() { std::cout << "Benz" << std::endl; } }; class BaoMCar : public ICar { public: virtual void carName() { std::cout << "BaoM" << std::endl; } }; //工厂类 class Factory { public: ICar* product(CARTYPE car) { ICar *ica = nullptr; switch (car) { case BEN_CHI: ica = new BenzCar(); break; case BAO_MA: ica = new BaoMCar(); break; case AO_DI: break; default: break; } return ica; } }; int main() { Factory *fctr = new Factory(); ICar *ica = fctr->product(BAO_MA); ica->carName(); delete ica; getchar(); return 0; }
工厂方法
模式
简述
工厂方法模式 是一种常用的对象创建型设计模式,此模式的核心思想是封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦,复用以及方便后期维护拓展的目的。
UML 结构图
抽象工厂:是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口
具体工厂:实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且被应用程序调用以创建产品对象。
抽象产品:所创建对象的基类,也就是具体产品的共同父类或共同拥有的接口。
具体产品:实现了抽象产品角色所定义的接口。某具体产品有专门的具体工厂创建,它们之间往往一一对应
优缺点
优点:
- 克服了简单工厂模式违背开放-封闭原则的缺点,又保留了封装对象创建过程的优点,降低客户端和工厂的耦合性。所以说,“工厂方法模式”是“简单工厂模式”的进一步抽象和推广。
缺点:
- 每增加一个产品,相应的也要增加一个子工厂,加大了额外的开发量。
案例分析
工厂模式基本和简单工厂模式差不多,简单工厂模式 - 在产品子类添加时,需要添加一个判断分支,这违背了开放-封闭原则。因此,工厂模式就是为了解决这个问题而产生的。
/*头文件*/ #include <iostream> enum CARTYPE { BEN_CHI = 0, BAO_MA = 1, AO_DI = 2 }; class ICar { public : virtual void carName() = 0; }; class Factory { public: virtual ICar* product(CARTYPE carTyp) = 0; }; /*源文件*/ #include "FactoryMethod.h" class Benz : public ICar { public: virtual void carName() { std::cout << "Benz" << std::endl; } }; class BaoM : public ICar { public: virtual void carName() { std::cout << "BaoM" << std::endl; } }; class BenFacty : public Factory { virtual ICar* product(CARTYPE carType) { return new Benz(); } }; class BaoFacty : public Factory { virtual ICar* product(CARTYPE carType) { return new BaoM(); } }; int main() { Factory *ben = new BenFacty(); ICar *benCar = ben->product(BEN_CHI); benCar->carName(); delete benCar; delete ben; getchar(); return 0; }