工厂模式

来源:互联网 发布:小翡君改号手机软件 编辑:程序博客网 时间: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