工厂模式
来源:互联网 发布:小翡君改号手机软件 编辑:程序博客网 时间:2024/06/14 00:54
借鉴于:C++设计模式——抽象工厂模式
#include <iostream>using namespace std;/*typedef enum ProductTypeTag{}PRODUCTTYPE;*/enum ProductTypeTag { TypeA, TypeB, TypeC};typedef enum ProductTypeTag PRODUCTTYPE;//一个纯虚函数,一个纯虚基类class Product{public: virtual void show() = 0;};//以下有由两个产品class ProductA : public Product{public: void show() { cout << "I'm Product A" << endl; }};class ProductB : public Product{public: void show() { cout << "I'm Product B" << endl; }};//下面要创建一个工厂类class Factory{public: Product * CreateProduct(PRODUCTTYPE type) { switch(type) { case TypeA: return new ProductA(); case TypeB: return new ProductB(); default: return 0; } }};void deleteAndPoint0 (void * obj){ delete obj; obj = 0; cout << "delete " << endl;}int main(){// cout << "Hello World!" << endl; //First ,create a factory object Factory *factory = new Factory(); Product * productObjA = factory->CreateProduct(TypeA); if (productObjA != 0) { productObjA->show(); } Product *productObjB = factory->CreateProduct(TypeB); if (productObjB != 0) { productObjB->show(); } deleteAndPoint0(factory); deleteAndPoint0(productObjA); deleteAndPoint0(productObjB); return 0;}/* * 以上为简单的工程模式,后面还有变更的 工厂方法模式 和 抽象工厂模式 * 至于工厂方法模式即:如果后续需要添加新的产品时,就要修改源码,这是大忌。 * 所以,就把工厂给作为抽象类。然后,如果新来一个产品,我就开一条流水线,专一生产这种产品。 * 以下为工厂类的编码。**/class Factory{public: virtual Product *CreateProduct() = 0;};class FactoryA : public Factory{public: Product *CreateProduct() { return new ProductA (); }};class FactoryB : public Factory{public: Product *CreateProduct() { return new ProductB (); }};/* * 还有一种情况:就是当产品过多是,一个产品对应一个产品类。就会把问题给复杂化,这样就出现了第三种衍变:抽象工厂模式 * 在这种方式中:把工厂和产品都进行了抽象。 * 通过把工厂进行整合,使抽象工厂中可以生产两种产品,例如 A 和 B。 * 而继承工厂的工厂1,则可以生产就有A 和 B 相似的产品。C 和 D * 而继承工厂的工厂2,则可以生产与 C,D不同,但继承与A B 的产品 E F。**/class ProductA{public: virtual void Show() = 0;};class ProductA1 : public ProductA{public: void Show() { cout<<"I'm ProductA1"<<endl; }};class ProductA2 : public ProductA{public: void Show() { cout<<"I'm ProductA2"<<endl; }};// Product Bclass ProductB{public: virtual void Show() = 0;};class ProductB1 : public ProductB{public: void Show() { cout<<"I'm ProductB1"<<endl; }};class ProductB2 : public ProductB{public: void Show() { cout<<"I'm ProductB2"<<endl; }};// Factoryclass Factory{public: virtual ProductA *CreateProductA() = 0; virtual ProductB *CreateProductB() = 0;};class Factory1 : public Factory{public: ProductA *CreateProductA() { return new ProductA1(); } ProductB *CreateProductB() { return new ProductB1(); }};class Factory2 : public Factory{ ProductA *CreateProductA() { return new ProductA2(); } ProductB *CreateProductB() { return new ProductB2(); }};//这样在新增产品时,避免工厂的多而管理困难的问题。
0 0
- 工厂模式 -- 工厂方法
- 工厂模式 -- 抽象工厂
- 工厂模式-简单工厂
- 工厂模式-工厂方法
- 工厂模式:静态工厂
- 工厂模式-简单工厂
- 工厂模式-抽象工厂
- 工厂模式-工厂方法
- 工厂 > 工厂方法模式
- 工厂模式-静态工厂
- 工厂模式-抽象工厂
- 工厂模式
- 工厂模式
- 工厂模式
- 工厂模式
- 工厂模式
- 工厂模式
- 工厂模式
- JAVA多线程系统学习吐血整理
- atom
- CronTab简介
- cordova-plugin-inappbrowser插件使用整理
- rpc 简单原理
- 工厂模式
- 百度地图开放平台 Web服务API --Geocoding API (地理编码和逆地理编码)
- 解决Mybatis 写xml映射时,eclipse不自动提示
- java调用.dll文件
- php+apache配置
- URL结构
- tomcat 端口号更改
- Handler的post方法创建的线程和UI线程有什么关系?
- linux下kettle带参数的执行