意图
需要为特定的客户或情况,提供对象组
问题
需要实例化一组相关的对象
解决方案
协调对象组的创建,提供一种方式,将如何执行对象实例化的规则从使用这些对象的客户对象提取出来。
参与者与协作者
为如何创建对象的每个成员定义接口。一般每个组都独立的concreteFactory进行创建
效果
将使用那些对象的规则和如何使用这些对象的逻辑分离开来
实现
定义一个抽象类来指定创建哪些对象。然后为每个组实现一个具体类。可以用表或文件完成同样的任务。
三个关键步骤:
- 找到变化并封装之
- 优先使用对象聚集,而不是继承。
- 针对接口而不是实现设计
根据职责分解方式
- 谁在使用我们的特定对象
- 谁来决定使用那些特定对象
结论:当问题域中存在不同组的对象,而且每组都用不同情况时,使用Abstract Factory
一般遵循三步曲实现。
- 找出实例化规则,定义一个带接口的抽象类,其中的接口为每种需要实现化的对象提供一个方法。
- 从这个类为每个组实现具体类
- 客户对象使用具体工厂对象创建所需要的服务对象