创建型模式 Creational Patterns
建造者模式 Builder Pattern
- 模式动机
- 建造者模式可以将部件及其组装过程分开,一步一步创建一个复杂的对象。用户只需要指定复杂对象的类型就可以得到该对象,而无须知道其内部的具体构造细节
- 复杂对象拥有一系列成员属性,这些成员属性中有些是引用类型的成员对象
- 建造者返还给客户端的是一个已经建造完毕的完整产品对象,而用户无须关心该对象所包含的属性以及它们的组装方式
- 模式定义
- 将一个复杂对象的构建 construction 与它的表示 representation 分离,使得同样的构建过程可以创建不同的表示
- 一步一步创建一个复杂对象
- 模式结构
- Builder 抽象建造者
- ConcreteBuilder 具体建造者
- Director 指挥者
- Product 产品角色

- 模式分析
- 建造者模式的结构中还引入了一个指挥者类Director,该类作用主要两个
- 隔离客户与生产过程
- 负责控制产品的生成过程
- 客户端只需要知道具体建造者的类型,即可通过指挥者类调用建造者的相关方法,返回一个完整的产品对象
- 建造者模式的结构中还引入了一个指挥者类Director,该类作用主要两个
- 优缺点
- 优点
- 客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象
- 每一个具体建造者都相对独立,用户使用不同的具体建造者即可得到不同的产品对象
- 可以更加精细地控制产品的创建过程
- 增加新的具体建造者无须修改原有类库的代码,指挥者类针对抽象建造者类编程,系统扩展方便,符合“开闭原则”
- 缺点
- 如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定限制
- 如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大
- 优点
- 模式适用环境
- 需要生成的产品对象有复杂的内部结构
- 需要生成的产品对象的属性相互依赖,需要指定其生成顺序
- 对象的创建过程独立于创建该对象的类
- 隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品
- 模式简化
- 省略抽象建造者角色
- 如果系统中只需要一个具体建造者就可以这样
- 省略指挥者角色
- 在具体建造者只有一个的情况下,如果抽象建造者角色已经被省略掉,那么还可以省略指挥者角色,让Builder角色扮演指挥者与建造者双重角色
- 省略抽象建造者角色
- 建造者模式与抽象工厂模式比较
- 建造者模式返回一个组装好的完整产品,而抽象工厂模式返回一系列相关的产品,这些产品位于不同的产品等级结构,构成了一个产品族
- 抽象工厂中客户端实例化工厂类,然后调用工厂方法获取所需产品对象;建造者模式中,客户端可以不直接建造者的相关方法,而是通过指挥者类来指导如何生成对象
- 抽象工厂模式可以看成汽车配件生产工厂,建造者模式是汽车组装工厂
原型模式 Prototype Pattern
-
模式动机
- 在面向对象系统中,使用原型模式来复制一个对象自身,从而克隆出多个与原型对象一模一样的对象
- 原型模式通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的方法创建出更多同类型的对象
-
模式定义
-
一种对象创建型模式,用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象
-
原型模式的基本工作原理是通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝原型自己来实现创建过程

-
- 模式结构
- Prototype 抽象原型类
- ConcretePrototype 具体原型类
- Client 客户类
- 模式分析
- 在原型模式结构中定义了一个抽象原型类,所有的Java类都继承自java.lang.Object,而Object类提供一个clone()方法,可以将一个Java对象复制一份。因此在java中可以直接用Object提供的clone()方法来实现对象的克隆,Java语言中的原型模式实现很简单
- 能够实现克隆的Java类必须实现一个标识接口Cloneable,表示这个Java类支持复制,如果没有实现这个接口但是调用了clone()方法,Java编译器会抛出一个CloneNotSupportedException异常
- Cloneable 是一个空接口,用来标记某个类允许被 Object.clone() 复制;如果没有实现它(implements Cloneable)却调用 super.clone(),运行时会抛 CloneNotSupportedException。默认 clone 是浅克隆
- 优缺点
- 优点
- 简化对象的创建过程,通过一个已有实例可以提高新实例的创建效率
- 可以动态增加或减少产品类
- 通过添加或移除原型对象,控制系统可以克隆生成哪些对象,而不是每次都修改工厂创建代码
- 原型模式提供了简化的创建结构
- 可以使用深克隆的方式保存对象的状态
- 缺点
- 需要为每一个类配备一个克隆方法,而且这个克隆方法对类的功能进行通盘考虑,这对全新的类来说不是很难,但对已有的类进行改造时,不一定是件容易的事,必须修改起源代码,违背了开闭原则
- 在实现深克隆时需要编写较为复杂的代码
- 优点
- 模式适用环境
- 创建新对象成本较大
- 如果系统要保存对象的状态,而对象的状态变化很小,或者对象本身占内存不大的时候,也可以使用原型模式配合备忘录模式来应用
- 需要避免使用分层次的工厂类来创建分层次的对象,并且类的实例对象只有一个或很少的几个组合状态,通过复制原型对象得到新实例可能比使用构造函数创建一个新实例更加方便
- 模式应用
- 很多软件提供的复制粘贴
- 模式扩展
- 带原型管理器的原型模式

- 相似对象的复制
- 通过原型模式获得相同对象后可以再对其属性进行修改,从而获取所需对象
- 带原型管理器的原型模式
高频英文术语 Glossary
| English Term | 中文 | 备注 |
|---|---|---|
| Creational Pattern | 创建型模式 | 处理对象创建 |
| Builder Pattern | 建造者模式 | 分离复杂对象的构建和表示 |
| Construction | 构建 | 创建对象的步骤或流程 |
| Representation | 表示 | 最终对象的具体形态和组成 |
| Builder | 抽象建造者 | 定义构建部件的方法 |
| ConcreteBuilder | 具体建造者 | 具体实现构建步骤 |
| Director | 指挥者 | 控制构建顺序 |
| Product | 产品角色 | 最终被创建的复杂对象 |
| getResult | 获取结果 | 返回构建完成的产品 |
| Prototype Pattern | 原型模式 | 通过复制原型创建新对象 |
| Prototype | 抽象原型 | 声明克隆接口 |
| ConcretePrototype | 具体原型 | 实现克隆方法 |
| Clone | 克隆 | 复制对象 |
| Cloneable | 可克隆标识接口 | Java 中标记类支持 clone() |
| Shallow Clone | 浅克隆 | 只复制对象本身,引用对象共享 |
| Deep Clone | 深克隆 | 对内部引用对象也复制 |
| Prototype Manager | 原型管理器 | 管理和注册原型对象 |
| Object Creation Cost | 对象创建成本 | 创建复杂对象所需资源和时间 |