目录
C++设计模式-抽象工厂(Abstract Factory)
一、意图
二、适用性
三、结构
四、参与者
五、代码
C++设计模式-抽象工厂(Abstract Factory)
一、意图
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
二、适用性
- 一个系统要独立于它的产品的创建、组合和表示时。
- 一个系统要由多个产品系列中的一个来配置时。
- 当你要强调一系列相关的产品对象的设计以便进行联合使用时。
- 当你提供一个产品类库,而只想显示它们的接口而不是实现时。
三、结构
四、参与者
- AbstractFactory
声明一个创建抽象产品对象的操作接口。
- ConcreteFactory
实现创建具体产品对象的操作。
- AbstractProduct
为一类产品对象声明一个接口。
- ConcreteProduct
定义一个将被相应的具体工厂创建的产品对象。
实现AbstractProduct接口。
- Client
仅使用由AbstractFactory和AbstractProduct类声明的接口。
五、代码
#include<iostream>
using namespace std;
class AbstractProduct {
public:
virtual void ShowInformation() = 0;
};
class AbstractProductA : public AbstractProduct {};
class ProductA1 : public AbstractProductA {
public:
void ShowInformation() {
cout << "ProductA1 Information" << endl;
}
};
class ProductA2 : public AbstractProductA {
public:
void ShowInformation() {
cout << "ProductA2 Information" << endl;
}
};
class AbstractProductB : public AbstractProduct {};
class ProductB1 : public AbstractProductB {
public:
void ShowInformation() {
cout << "ProductB1 Information" << endl;
}
};
class ProductB2 : public AbstractProductB {
public:
void ShowInformation() {
cout << "ProductB2 Information" << endl;
}
};
class AbstractFactory {
public:
virtual AbstractProductA* CreateProductA() = 0;
virtual AbstractProductB* CreateProductB() = 0;
};
class FactoryOne : public AbstractFactory {
public:
AbstractProductA* CreateProductA() {
return new ProductA1;
}
AbstractProductB* CreateProductB() {
return new ProductB1;
}
};
class FactoryTwo : public AbstractFactory {
public:
AbstractProductA* CreateProductA() {
return new ProductA2;
}
AbstractProductB* CreateProductB() {
return new ProductB2;
}
};
int main() {
AbstractFactory* factoryOne = new FactoryOne;
AbstractProduct* productA1 = factoryOne->CreateProductA();
AbstractProduct* productB1 = factoryOne->CreateProductB();
productA1->ShowInformation();
productB1->ShowInformation();
AbstractFactory* factoryTwo = new FactoryTwo;
AbstractProduct* productA2 = factoryTwo->CreateProductA();
AbstractProduct* productB2 = factoryTwo->CreateProductB();
productA2->ShowInformation();
productB2->ShowInformation();
return 0;
}