抽象工廠模式是一種設計模式,其主要目的是提供一種方法,用于建立一組相關或依賴的對象,而不需要關心它們的具體類。
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)。
抽象工廠模式的優點:
- 可以生成一組相關産品,不需要關心具體的生産過程,降低了用戶端代碼的複雜度。
- 抽象工廠模式支援設計模式的擴充,可以很容易地擴充新的産品類。
- 通過使用抽象工廠模式,可以隔離産品類,使得用戶端代碼不需要關心産品類的具體實作。
抽象工廠模式的缺點:
- 代碼複雜度比較高,需要定義較多的抽象類和接口。
- 不适用于生産一種産品的場景,需要選擇更适合的設計模式。
- 如果需要添加新工廠,需要修改代碼,違背了開閉原則。