一、UML图
二、包含的角色
AbstractProductA和AbstractProductB类,是抽象类。定义了该类型产品的相关操作。
ConcreteProductA1、ConcreteProductA2、ConcreteProductB1和ConcreteProductB2类,是对以上抽象类的具体分类实现。各自通过不同的方式去实现该类产品的相关操作。
AbstractFactory类是抽象工厂类,里面应该包含生产各类(A,B)产品的抽象方法。
ConcreteFactory1和ConcreteFactory2类,具体工厂。生成分别生产特定产品。比如,本例ConcreteFactory1生产的是ConcreteProductA1和ConcreteProductB1这两种产品。
三、特点
定义:抽象工厂模式(Abstract Factory),提供了一个创建一系 列相关或相互依赖的接口,而无需制定它们具体的类。
为创建不同的产品,客户端应使用不同的具体工厂。
便于交换产品系列。让具体创建实例过程与客户调用分离。客户调用通过接口操作实例,产品具体类也被具体工厂分离,不会出现在客户调用代码中。
四、代码实现
产品AbstractProductA、AbstractProductB 实现
class AbstractProductA {
public:
AbstractProductA() {
}
virtual ~AbstractProductA() {
}
public:
virtual void OperationA() = 0;
};
class AbstractProductB {
public:
AbstractProductB() {
}
virtual ~AbstractProductB() {
}
public:
virtual void OperationB() = 0;
};
具体产品类ConcreteProductA1、ConcreteProductA2、ConcreteProductB1和ConcreteProductB2
class ConcreteProductA1 : public AbstractProductA
{
public:
void OperationA() override
{
std::cout<<"OperationA ConcreteProductA1"<<std::endl;
}
};
工厂AbstractFactory类
class AbstractFactory {
public:
AbstractFactory() {
}
virtual ~AbstractFactory() {
}
public:
virtual AbstractProductA *CreateProductA() = 0;
virtual AbstractProductB *CreateProductB() = 0;
};
ConcreteFactory1和ConcreteFactory2类(两个类似,这里也只写了一个)。
class ConcreteFactory1 : public AbstractFactory
{
public:
AbstractProductA *CreateProductA() override
{
return new ConcreteProductA1();
}
AbstractProductB *CreateProductB() override
{
return new ConcreteProductB1();
}
};
frontend
std::unique_ptr<AbstractFactory> factory(new ConcreteFactory1);
std::unique_ptr<AbstractProductA> productA1(factory->CreateProductA());
productA1->OperationA();
std::unique_ptr<AbstractProductB> productB1(factory->CreateProductB());
productB1->OperationB();
factory.reset(new ConcreteFactory2());
std::unique_ptr<AbstractProductA> productA2(factory->CreateProductA());
productA2->OperationA();
std::unique_ptr<AbstractProductB> productB2(factory->CreateProductB());
productB2->OperationB();
以上为抽象工厂模式的最基础实现。意在说明本模式,实际应用中根据需求去更改代码。
如:这里new具体工厂类的操作,还可以根据具体调用需求,在抽象工厂中提取一个创建具体工厂的接口(像简单工厂那样的)。达到屏蔽具体工厂的客户端调用(解耦)。