C++实现设计模式之——工厂模式
来源:互联网 发布:施耐德plc编程软件 编辑:程序博客网 时间:2024/06/05 01:55
适用范围:
需要创建大量不同对象,并且需要集中管理。例如你要买一辆汽车,你不必关心汽车的构造,以及汽车的创建过程,你只关心,你付钱给厂商,提需求,我需要一辆Golf,然后就是等待厂商交付车。汽车的零件的生产和组装全在工厂完成,这个时候,工厂就是一个集中生产和组装的中心,通过工厂来创建一辆汽车。
工厂模式有三种,分别是:
- 简单工厂模式
- 工厂方法模式
- 抽象工厂模式
1.简单工厂模式
示例如下
template<typename T>class ApplicationSingleTon{public: static T* getInstance() { if (_instance == nullptr) { _instance = new T(); } return _instance; }private: static T* _instance;};template <typename T>T* ApplicationSingleTon<T>::_instance = nullptr;class Product {public: virtual void display() = 0;};class Engine : public Product{public: virtual void display() { cout << "create a engine"<<endl; }};class Wheel : public Product{public: virtual void display() { cout << "create a wheel"<<endl; }};enum CarMade{ CarMade_Engine = 0, CarMade_Whell};class Factory : public ApplicationSingleTon<Factory>{public: Product* create(CarMade type) { switch (type) { case CarMade_Engine: return new Engine(); break; case CarMade_Whell: return new Wheel(); break; default: break; } }};int main(){ Engine* eng; Wheel* wheel[3]; //create engine eng = (Engine*)Factory::getInstance()->create(CarMade_Engine); eng->display(); //create 4 wheel for (int i=0; i <4; i++) { wheel[i] = (Wheel*)Factory::getInstance()->create(CarMade_Whell); wheel[i]->display(); } system("pause"); return 0;}
结合上一章节的单例模式,本示例使用了单例模式,工厂唯一,该工厂主要生产汽车,大家都知道汽车发动机和轮子组成。在工厂中,有一条生产线create(CarMade type),通过传入相应的指令type来决定生产什么零件,不需要手动去创建这些不同的零件。这里让Engine和Wheel类都继承自Product,是为了在create后,返回一个Product对象,然后在操作的时候对返回的Product强制转换成需要的对象。该示例完成说明了简单工厂的实现方式。简单工厂的缺点是,现在有这么一种情况,工厂现在收到上级要求,需要生产一种新的零件,我们假设为座椅。这个时候需要先在枚举中加入这种零件,然后在生产线中增加生产该零件的流程,是不是显得很繁琐,当后面生产的零件越来越多,后面扩展起来也就越来越差,于是就有了下面的实现方式
1.工厂方法模式
示例如下
class Factory{public: virtual Product* create() = 0;};class FactoryEngine : public Factory, public ApplicationSingleTon<FactoryEngine>{public: virtual Product* create() { return new Engine(); }};class FactoryWheel : public Factory, public ApplicationSingleTon<FactoryWheel>{public: virtual Product* create() { return new Wheel(); }};int main(){ Engine* eng; Wheel* wheel[3]; //create engine eng = (Engine*)FactoryEngine::getInstance()->create(); eng->display(); //create 4 wheel for (int i=0; i <4; i++) { wheel[i] = (Wheel*)FactoryWheel::getInstance()->create(); wheel[i]->display(); } system("pause"); return 0;}
早期生产汽车零部件的工厂比较少,所以基本上一个汽车的所有零件都在汽车公司生产,这样一来就显得很不效率,慢慢的很多汽车厂商将汽车零部件的生产放到了其他的工厂去,这样,可能A公司生产发动机,B公司生产轮子。。。厂商就可以把重心放在装配上了。上述示例代码演示了这一模式。工厂抽象化,然后具体的生产零部件的工厂继承该抽象类,每个不同的工厂只需要关心自己所生产的零部件即可,即使其中一个零件工厂停止工作,也不会影响其他的工厂,换成简单工厂模式,只要流水线出现问题,整个工厂就崩溃了。将零件分拆成不同的工厂生产,方便后期扩展,例如这个时候,需要生产一个新的零件,只需要找个新的工厂即可,即使这个工厂流程上有问题,也不会影响到当前其他工厂流水线的正常工作。
可是像汽车的零件可能有非常的多,为每一个零件的生产新建一个工厂,可能不太现实,在管理起来也比较麻烦,资源上也比较浪费,于是就有了第三种模式
3.抽象工厂模式
抽象模式相对于工厂方法模式,其实就是在之前的工厂中新增一条流水线,例如之前生产发动机的厂商,现在新增了一条流水线用于生产变速箱,之前生产轮子的工厂,新增一条流水线用于生产方向盘。
示例如下
class Product {public: virtual void display() = 0;};class Engine : public Product{public: virtual void display() { cout << "create a engine"<<endl; }};class Wheel : public Product{public: virtual void display() { cout << "create a wheel"<<endl; }};class Speed : public Product{public: virtual void display() { cout << "create a Transmission box" << endl; }};enum CarMade{ CarMade_Engine = 0, CarMade_Whell};class Factory{public: virtual Product* create() = 0; //新增生产变速箱 virtual Product* createSpeed() = 0;};class FactoryEngine : public Factory, public ApplicationSingleTon<FactoryEngine>{public: virtual Product* create() { return new Engine(); } virtual Product* createSpeed() { return new Speed(); }};class FactoryWheel : public Factory, public ApplicationSingleTon<FactoryWheel>{public: virtual Product* create() { return new Wheel(); } virtual Product* createSpeed() { return new Speed(); }};
至此,三种工厂模式的实现已经介绍完成,更多的还需要大家自己去理解,实现符合自己项目需要的模式。谢谢
- C语言实现《设计模式之禅》之工厂模式——标准工厂
- C语言实现《设计模式之禅》之工厂模式——抽象工厂
- 设计模式之——工厂模式(C)
- 设计模式之“工厂模式” ——C++实现
- C++实现设计模式之——工厂模式
- 设计模式之—工厂方法模式(FactoryMethod)-Java实现
- 设计模式之——工厂模式
- 设计模式之——工厂模式
- 设计模式之——工厂模式
- 设计模式之——工厂模式
- 设计模式之工厂模式(c++)
- C#--设计模式之简单工厂模式
- C#--设计模式之工厂方法模式
- 设计模式之C++实现 - 工厂模式
- C++实现设计模式之工厂模式
- Java实现设计模式之工厂模式
- Java设计模式之工厂模式——简单工厂
- 设计模式——工厂模式之简单工厂
- PowerDesigner重新学习
- (结构型模式)FLYWEIGHT——享元模式
- 计算机图形学(二)输出图元_11_OpenGL多边形填充区函数(下)
- 设计模式入门
- Apache + PHP + MariaDB环境搭建
- C++实现设计模式之——工厂模式
- 行为型模式:OBSERVER——观察者模式
- 中国压缩传感资源(China Compressive Sensing Resources)
- Java学习基础(2)
- 结构型模式:DECORATOR——装饰模式
- Linux快捷键大全
- java中Math的一些用法
- 回调函数
- 跳转页面的实现