设计模式-创建模式-抽象工厂模式

2020-04-28  本文已影响0人  阿棍儿_Leon

随着生产规模扩大,工厂和产品的管理就变得麻烦了,为了不再增加工厂种类,可以增加原有工厂的生产能力。
例如产品不仅分为A、B两类,还可以按照另一种维度分为0、1两类,这相当于为每一个字母大类都增加了一个数字子类产品。这时,可以扩展每个工厂的能力,令每个工厂还是都可以生产A、B两类产品,但是每个工厂都只能生产一个数字子类产品。

以下代码定义产品分类,产品A分为A0和A1两类,产品B分为B0和B1两类。

#include <iostream>

using namespace std;

class ProductsA
{
public:
    virtual void Display() = 0;
    virtual ~ProductsA(){}
};

class ProductA0:public ProductsA
{
public:
    void Display()
    {
        cout<<__PRETTY_FUNCTION__<<endl;
    }
};

class ProductA1:public ProductsA
{
public:
    void Display()
    {
        cout<<__PRETTY_FUNCTION__<<endl;
    }
};

class ProductsB
{
public:
    virtual void Display() = 0;
    virtual ~ProductsB(){}
};

class ProductB0:public ProductsB
{
public:
    void Display()
    {
        cout<<__PRETTY_FUNCTION__<<endl;
    }
};

class ProductB1:public ProductsB
{
public:
    void Display()
    {
        cout<<__PRETTY_FUNCTION__<<endl;
    }
};

以下代码定义工厂类,分为0类工厂和1类工厂,分别生产两种产品。

class AbstractFactory
{
public:
    virtual ProductsA* CreateProductA()=0;
    virtual ProductsB* CreateProductB()=0;
};

class Factory0:public AbstractFactory
{
public:
    ProductsA* CreateProductA()
    {
        return new ProductA0();
    }
    ProductsB* CreateProductB()
    {
        return new ProductB0();
    }
};

class Factory1:public AbstractFactory
{
public:
    ProductsA* CreateProductA()
    {
        return new ProductA1();
    }
    ProductsB* CreateProductB()
    {
        return new ProductB1();
    }
};

以下代码用0、1工厂分别生产了A、B类商品,一共是4种商品。

int main(void){

    AbstractFactory* factory0 = new Factory0();
    ProductsA* productA = factory0->CreateProductA();
    productA->Display();
    ProductsB* productB = factory0->CreateProductB();
    productB->Display();
    delete factory0;
    delete productA;
    delete productB;

    AbstractFactory* factory1 = new Factory1();
    productA = factory1->CreateProductA();
    productA->Display();
    productB = factory1->CreateProductB();
    productB->Display();
    delete factory1;
    delete productA;
    delete productB;

    return 0;
}

输出

virtual void ProductA0::Display()
virtual void ProductB0::Display()
virtual void ProductA1::Display()
virtual void ProductB1::Display()
上一篇 下一篇

猜你喜欢

热点阅读