## 一、建造者模式
将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
### 建造模式的出现
**引子**
> 借用书上的例子,那炒菜(西红柿鸡蛋)来说,我们需要的原材料有:鸡蛋,西红柿;基本调料:油,盐/糖,葱花。
> 每次我们都需要重复这样的操作,可悲的是,尽管调料,材料都很少,厨师还是会出现忘记加盐,或者葱花的情况。怎么办?
> 为了解决这个问题,我们来分析一下,这些东西都是做菜不可缺少的东西,我们可以给这个菜制定一个流程,每次都按照这个流程去做,这样就不会忘记。
> 当然有的人胃口比较重,需要多加盐,有的人喜欢吃甜的,那我们就需要加一样调料:糖。针对这些具体的细节要求,我们需要有在做菜前有一个说明,告诉厨师多加盐,或者放糖,不放盐。
把这个模式放到编程的世界就是建造者模式。
来类比一下:
<table border="1" cellspacing="0" cellpadding="0" valign="top" style="border-bottom:#a3a3a3 1pt solid; border-left:#a3a3a3 1pt solid; border-collapse:collapse; direction:ltr; margin-left:0.333in; border-top:#a3a3a3 1pt solid; border-right:#a3a3a3 1pt solid"><tbody><tr><td style="border-bottom:#a3a3a3 1pt solid; border-left:#a3a3a3 1pt solid; padding-bottom:4pt; padding-left:4pt; width:1.202in; padding-right:4pt; vertical-align:top; border-top:#a3a3a3 1pt solid; border-right:#a3a3a3 1pt solid; padding-top:4pt"><p style="margin:0in; font-family:SimSun; font-size:14pt">生活</p></td><td style="border-bottom:#a3a3a3 1pt solid; border-left:#a3a3a3 1pt solid; padding-bottom:4pt; padding-left:4pt; width:1.211in; padding-right:4pt; vertical-align:top; border-top:#a3a3a3 1pt solid; border-right:#a3a3a3 1pt solid; padding-top:4pt"><p style="margin:0in; font-family:SimSun; font-size:14pt">西红柿流程</p></td><td style="border-bottom:#a3a3a3 1pt solid; border-left:#a3a3a3 1pt solid; padding-bottom:4pt; padding-left:4pt; width:0.813in; padding-right:4pt; vertical-align:top; border-top:#a3a3a3 1pt solid; border-right:#a3a3a3 1pt solid; padding-top:4pt"><p style="margin:0in; font-family:SimSun; font-size:14pt">说明</p></td><td style="border-bottom:#a3a3a3 1pt solid; border-left:#a3a3a3 1pt solid; padding-bottom:4pt; padding-left:4pt; width:1.3in; padding-right:4pt; vertical-align:top; border-top:#a3a3a3 1pt solid; border-right:#a3a3a3 1pt solid; padding-top:4pt"><p style="margin:0in; font-family:SimSun; font-size:14pt">加盐西红柿</p></td><td style="border-bottom:#a3a3a3 1pt solid; border-left:#a3a3a3 1pt solid; padding-bottom:4pt; padding-left:4pt; width:1.34in; padding-right:4pt; vertical-align:top; border-top:#a3a3a3 1pt solid; border-right:#a3a3a3 1pt solid; padding-top:4pt"><p style="margin:0in; font-family:SimSun; font-size:14pt">加糖西红柿</p></td></tr><tr><td style="border-bottom:#a3a3a3 1pt solid; border-left:#a3a3a3 1pt solid; padding-bottom:4pt; padding-left:4pt; width:1.202in; padding-right:4pt; vertical-align:top; border-top:#a3a3a3 1pt solid; border-right:#a3a3a3 1pt solid; padding-top:4pt"><p style="margin:0in; font-family:SimSun; font-size:14pt">建造者模式</p></td><td style="border-bottom:#a3a3a3 1pt solid; border-left:#a3a3a3 1pt solid; padding-bottom:4pt; padding-left:4pt; width:1.211in; padding-right:4pt; vertical-align:top; border-top:#a3a3a3 1pt solid; border-right:#a3a3a3 1pt solid; padding-top:4pt"><p style="margin:0in; font-family:SimSun; font-size:14pt">建造者</p></td><td style="border-bottom:#a3a3a3 1pt solid; border-left:#a3a3a3 1pt solid; padding-bottom:4pt; padding-left:4pt; width:0.813in; padding-right:4pt; vertical-align:top; border-top:#a3a3a3 1pt solid; border-right:#a3a3a3 1pt solid; padding-top:4pt"><p style="margin:0in; font-family:SimSun; font-size:14pt">指挥者</p></td><td style="border-bottom:#a3a3a3 1pt solid; border-left:#a3a3a3 1pt solid; padding-bottom:4pt; padding-left:4pt; width:1.3in; padding-right:4pt; vertical-align:top; border-top:#a3a3a3 1pt solid; border-right:#a3a3a3 1pt solid; padding-top:4pt"><p style="margin:0in; font-size:14pt"><span lang="zh-CN" style="font-family:SimSun">建造者子类</span><span lang="en-US" style="font-family:Calibri">1</span></p></td><td style="border-bottom:#a3a3a3 1pt solid; border-left:#a3a3a3 1pt solid; padding-bottom:4pt; padding-left:4pt; width:1.34in; padding-right:4pt; vertical-align:top; border-top:#a3a3a3 1pt solid; border-right:#a3a3a3 1pt solid; padding-top:4pt"><p style="margin:0in; font-size:14pt"><span lang="zh-CN" style="font-family:SimSun">建造者子类</span><span lang="en-US" style="font-family:Calibri">2</span></p></td></tr></tbody></table>
建造者模式把一个对象的基本构建给造出来,然后根据修饰细节的不同再进行扩展创建。
注意:
1、所有的扩展子类都必须实现父类——保证建造的初衷不变。
2、子类的扩展时对父类的细节修饰——不是实质改变
## 二、类图
![](https://box.kancloud.cn/2016-02-18_56c5ce70d2b5e.png)
从图中可以看出,具体的实现是CreateeBuilder来完成的,而CreateBulider之间具体的不同又是依赖现实生活中的东西Things来体现的。
- 前言
- 抽象工厂——创建型设计模式一
- 工厂三姐妹——创建型设计模式之二
- 初识面向对象设计模式
- 建造者模式——创建型模式之三
- 原型模式——创建型设计模式四
- 适配器 and 组合模式——结构性模式之一
- 桥接模式——结构性设计模式之二
- 组合模式——结构型设计模式之三
- 装饰模式——结构型设计模式之四
- 外观模式——结构型设计模式之五
- 代理模式——结构型设计模式之六
- 观察者模式——行为型设计模式之五
- 模板设计——行为设计模式之一
- 命令模式——行为设计模式之二
- 状态模式——行为型设计模式之三
- 职责模式——行为设计模式之四
- 中介模式——行为模式之六
- 策略+简单工厂 实战篇
- 看观察者怎么全方位观察机房收费系统
- 登陆也需要装饰——机房收费系统装饰模式实战
- 何为抽象?你有本末倒置吗?
- 再回首,策略、简单工厂是否依然?
- 再回首——行为型设计模式