主旋律
将关于该系统使用哪些具体的类的信息封装起来
隐藏了这些类的实例是如何被创建和放在一起的
Abstract Factory 抽象工厂
意图
提供一个创建一系列相关或互相依赖对象的接口 而无需制定他们具体的类
结构图
协作
- 通常运行时创建一个ConcreteFactory类的实例
- 产品对象的创建延迟到子类
问题
- 通常难以支持新种类的产品 因为AbstractFactory确定了可以创建的产品集合 支持新的产品需要扩展该工厂接口 涉及到所有子类的改变
实现
- 通常工厂作为单例 通常一个产品系列只需要一个工厂
- 通常AbstractFactory会定义一个工厂方法(Factory Method) 具体工厂也可以使用Prototype模式来实现
在基于原型的方法中 可以使得不是每个新的产品系列都需要一个新的具体工厂类 - 定义可扩展的工厂
可以解决上述难以扩展的问题
这种方法是在创建对象的接口增加一个类型参数 该参数指定创建何种对象
这样的情况下AbstractFactory只需要一个Make即可这就是前面在第二点中所说的基于Prototype的工厂
Builder 生成器
意图
讲一个复杂对象的构建和他的表示分离,使得同样的构建过程可以创建不同的不同的表示
结构图
协作
- 客户端创建Director对象 并使用他所想要的Builder进行配置
- 产品部件被生成 导向器会通知生成器
- 生成器处理导向器的请求 将部件添加到产品中
- 客户端从生成器检索产品
实现
- 需要访问之前已经构造好的部件产品 比如在构建PartB需要访问前一个步骤构建的PartA
通常在这种情况下 生成器会返回一个子节点个导向者 然后导向者将他们回传给生成者去创建父节点 - 一般使用生成器生成的产品差异比较大 基本不需要公共父类
- Builder父类一般为缺省的空方法
比如c++中不声明为纯虚函数而是定义为空方法 可以是子类只定义自己感兴趣的操作
相关模式
- Composite通常是用Builder生成的
- Abstract Factory 注重多个系列的产品对象 Builder着重一步步构造一个复杂对象
Abstract Factory 的产品是立刻返回的 Buil