天天看點

C++設計模式(三、抽象工廠模式)

抽象工廠模式是一種設計模式,其主要目的是提供一種方法,用于建立一組相關或依賴的對象,而不需要關心它們的具體類。

C++ 中的抽象工廠模式代碼如下:

#include <iostream>
#include <map>

class AbstractProductA
{
public:
    virtual void operationA() = 0;
};

class ProductA1 : public AbstractProductA
{
public:
    void operationA() { std::cout << "ProductA1" << std::endl; }
};

class ProductA2 : public AbstractProductA
{
public:
    void operationA() { std::cout << "ProductA2" << std::endl; }
};

class AbstractProductB
{
public:
    virtual void operationB() = 0;
};

class ProductB1 : public AbstractProductB
{
public:
    void operationB() { std::cout << "ProductB1" << std::endl; }
};

class ProductB2 : public AbstractProductB
{
public:
    void operationB() { std::cout << "ProductB2" << std::endl; }
};

class AbstractFactory
{
public:
    virtual AbstractProductA* createProductA() = 0;
    virtual AbstractProductB* createProductB() = 0;
};

class Factory1 : public AbstractFactory
{
public:
    AbstractProductA* createProductA() { return new ProductA1; }
    AbstractProductB* createProductB() { return new ProductB1; }
};

class Factory2 : public AbstractFactory
{
public:
    AbstractProductA* createProductA() { return new ProductA2; }
    AbstractProductB* createProductB() { return new ProductB2; }
};

int main()
{
    std::map<int, AbstractFactory*> factories;
    factories[0] = new Factory1;
    factories[1] = new Factory2;

    AbstractProductA* productA = factories[0]->createProductA();
    AbstractProductB* productB = factories[0]->createProductB();
    productA->operationA();
    productB->operationB();

    delete productA;
    delete productB;
    delete factories[0];
    delete factories[1];

    return 0;
}           

抽象工廠模式由以下幾個部分組成:

  • 抽象産品類(Abstract Product):它是一個抽象類,它定義了所有具體産品類(Product)的共同點。
  • 具體産品類(Concrete Product):它是抽象産品類的實作,它代表了一種具體的産品。
  • 抽象工廠類(Abstract Factory):它是一個抽象類,它定義了所有具體工廠類(Concrete Factory)的共同點。
  • 具體工廠類(Concrete Factory):它是抽象工廠類的實作,它生産的是一組具體的産品(Product)。
  • 用戶端(Client):它是應用程式的入口點,它使用了抽象工廠(Abstract Factory)和抽象産品(Abstract Product)。

抽象工廠模式的優點:

  • 可以生成一組相關産品,不需要關心具體的生産過程,降低了用戶端代碼的複雜度。
  • 抽象工廠模式支援設計模式的擴充,可以很容易地擴充新的産品類。
  • 通過使用抽象工廠模式,可以隔離産品類,使得用戶端代碼不需要關心産品類的具體實作。

抽象工廠模式的缺點:

  • 代碼複雜度比較高,需要定義較多的抽象類和接口。
  • 不适用于生産一種産品的場景,需要選擇更适合的設計模式。
  • 如果需要添加新工廠,需要修改代碼,違背了開閉原則。

繼續閱讀