1. 意图
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
2. 四种角色
抽象产品(Product)、具体产品(Concrete Product)、抽象工厂(Abstract Factory)、具体工厂(Concrete Factory)。
3. 优点
3.1 分离了具体的类。Client只需使用抽象工厂类和抽象产品类的接口。
3.2 易于交换产品系列。改变具体工厂很容易。
3.3 有利于产品的一致性。一次只能使用同已个系列中的对象。
4. 缺点
4.1 难以支持新种类的产品。
支持新产品需要修改抽象工厂类及其所有子类工厂。
一个更灵活但不太安全的方法是给创建对象的操作增加一个参数,该参数指定对象的种类。
5. 相关模式
5.1 抽象工厂类通常用工厂方法(Factory Method)实现,也可用原型(Prototype)实现。
5.2 一个具体的工厂通常是一个单件(Singleton) 。
6. 代码示意(C++)
#pragma once
#include <iostream>
using namespace std;
class AbstractProductA
{
public:
virtual void Show() = 0;
};
class ProductA1 : public AbstractProductA
{
public:
virtual void Show() {
cout << "系列1:ProductA" << endl;
}
};
class ProductA2 : public AbstractProductA
{
public:
virtual void Show() {
cout << "系列2:ProductA" << endl;
}
};
class AbstractProductB
{
public:
virtual void Show() = 0;
};
class ProductB1 : public AbstractProductB
{
public:
virtual void Show() {
cout << "系列1:ProductB" << endl;
}
};
class ProductB2 : public AbstractProductB
{
public:
virtual void Show() {
cout << "系列2:ProductB" << endl;
}
};
class AbstractFactory
{
public:
virtual AbstractProductA* CreateProductA() = 0;
virtual AbstractProductB* CreateProductB() = 0;
};
class ConcreteFactory1 :
public AbstractFactory
{
public:
AbstractProductA* CreateProductA() {
return new ProductA1;
}
AbstractProductB* CreateProductB() {
return new ProductB1;
}
};
class ConcreteFactory2 :
public AbstractFactory
{
public:
AbstractProductA* CreateProductA() {
return new ProductA2;
}
AbstractProductB* CreateProductB() {
return new ProductB2;
}
};
#include "AbstractFactory.h"
int main() {
AbstractFactory* pFactory = new ConcreteFactory1;
AbstractProductA* pProductA = pFactory->CreateProductA();
AbstractProductB* pProductB = pFactory->CreateProductB();
pProductA->Show();
pProductB->Show();
delete pProductA;
delete pProductB;
delete pFactory;
return 0;
}
运行结果:
6.1 要更换产品系列,只需在main函数里用ConcreteFactory2来替换ConcreteFactory1即可(3.2)。
6.2 但如果要增加新产品ProductC,则AbstractFactory需增加新接口,ConcreteFactory1和
ConcreteFactory2也要做相应的修改(4.1)。