目录
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;
}