抽象工厂(abstract factory)
意图
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
问题思考
考虑一个跨平台GUI框架(比如qt),有窗口,菜单,弹窗等基本widget。然而各个系统的创建widget的API肯定是不一样的,GUI框架需要统一创建widget的接口。比如CreateDialog,我们可以在具体实现中根据OS类型,来决定调用CreateWindowsDialog还是CreateMacOSDialog。但由于GUI widget众多,我们不可能在每一个创建widiget的方法中来进行判断。这个时候,就用到了抽象工厂(abstract factory)
适用性
- 一个系统要独立于它的产品的创建、组合和表示的时候
- 一个系统要由多个产品系列中的一个来配置的时候
- 当你提供一个产品类库,而只想显示它们的接口而不是实现的时候。
类图
实现
class AbstractFactory {
public:
virtual IProductA *CreateProductA() = 0;
virtual IProductB *CreateProductB() = 0;
};
class ConcreteFactory1 : public AbstractFactory {
public:
IProductA *CreateProductA() override {
return new ProductA1();
}
IProductB *CreateProductB() override {
return new ProductB1();
}
};
class ConcreteFactory2 : public AbstractFactory{
public:
IProductA *CreateProductA() override {
return new ProductA2();
}
IProductB *CreateProductB() override {
return new ProductB2();
}
};