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)。