1. 意图
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
2. 实现
这一接口内,将负责创建所有这一系列相关的对象,因此,每个实现该接口的对象,都必须实现创建所有相关对象的函数。这一系列相关的对象,总是伴随着每个实现该接口的对象而成组出现的。
可以把这里的“工厂”,理解成创建一组相关对象的工厂。只是不同的工厂间,产生的对象其风格不同而已,但每组对象的数量总是相同的。
3. 适用性
在以下情况可以使用Abstract Factory 模式:
a. 一个系统要独立于它的产品的创建、组合和表示时;
b. 一个系统要由多个产品系列中的一个来配置时;
c. 当你要强调一系列相关的产品对象的设计以便进行联系使用时;
d. 当你提供一个产品类库,而只想显示它们的接口而不是实现时。
4. 参与者
a. AbstractFactory: 声明一个创建抽象产品对象的操作接口;
b. ConcreteFactory: 实现创建具体产品对象的操作;
c. AbstractProduct: 为一类产品对象声明一个接口;
d. ConcreteProduct: 定义一个将被相应的具体工厂创建的产品对象,实现AbstractProduct 接口;
e. Client: 仅使用AbstractFactory 和AbstractProduct 类声明的接口,由于只关心接口,从而实现不关心具体的类。
5. 协作
通常在运行时刻,创建一个ConcreteFactory 类的实例。这一具体的工厂创建具有特定实现的产品对象。为创建不同的产品对象,客户应使用不同的具体工厂。
AbstractFactory 将产品对象的创建延迟到它的ConcreteFactory 子类。
6. 效果
使用Abstract Factory 模式,具有下面的优点:
a. 分离了具体的类;
b. 使得易于交换产品系列;
c. 有利于产品的一致性: 当一个系列中的产品对象被设计成一起工作时,一个应用一次只能使用一个系列中的对象,从而保持产品对象的一致性;
不足之处在于:
难以支持新种类的产品。一旦要支持新的产品,势必在AbstractFactory 接口中增加相应的创建新产品的接口函数,从而每个实现AbstractFactory 的ConcreteFactory 都必须相应地修改,支持新产品。故,支持新产品是件很麻烦的事情。