[toc]
## 举个例子
**搭积木**
> 孩子们能快速地用积木搭建出自己想要的东西
> 一是因为孩子们的想像力丰富、聪明可爱;二是因为积木盒中有很多现成的积木部件,孩子们只需要按照自己的想法把它们拼接起来即可。
> 而拼接的过程就是孩子们实现自己想像力的创造过程
## 代码示例
```php
<?php
// 玩具
class Toy {
protected $name;
protected $components;
public function __construct($name) {
$this->name = $name;
$this->components = [];
}
public function getName() {
return $this->name;
}
public function addComponent($component, $count = 1, $unit = "个") {
$tmp_array = [$component, $count, $unit];
array_push($this->components, $tmp_array);
echo $this->name . "增加了" . strval($count) . $unit . $component . PHP_EOL;
}
public function feature() {
}
}
// 小车
class Car extends Toy {
public function feature() {
echo "我是" . $this->name . ", 我可以快速奔跑..." . PHP_EOL;
}
}
// 庄园
class Manor extends Toy {
public function feature() {
echo "我是" . $this->name . ", 我可供观赏,也可用来游玩!" . PHP_EOL;
}
}
class ToyBuilder {
public function buildCar() {
$car = new Car("迷你小车");
echo "正在构建" . $car->getName() . "..." . PHP_EOL;
$car->addComponent("轮子", 4);
$car->addComponent("车身", 1);
$car->addComponent("改动机", 1);
$car->addComponent("方向盘");
return $car;
}
public function buildManor() {
$manor = new Manor("淘淘小庄园");
echo "正在构建" . $manor->getName() . "..." . PHP_EOL;
$manor->addComponent('客厅', 1, "间");
$manor->addComponent('卧室', 2, "间");
$manor->addComponent("书房", 1, "间");
$manor->addComponent("厨房", 1, "间");
$manor->addComponent("K吧", 1, "间");
$manor->addComponent("花园", 1, "个");
$manor->addComponent("围墙", 1, "堵");
return $manor;
}
}
// 测试代码
$builder = new ToyBuilder();
$car = $builder->buildCar();
$car->feature();
echo PHP_EOL;
$manor = $builder->buildManor();
$manor->feature();
```
```
D:\soft\php72\php.exe D:\project\php_dp\index.php
正在构建迷你小车...
迷你小车增加了4个轮子
迷你小车增加了1个车身
迷你小车增加了1个改动机
迷你小车增加了1个方向盘
我是迷你小车, 我可以快速奔跑...
正在构建淘淘小庄园...
淘淘小庄园增加了1间客厅
淘淘小庄园增加了2间卧室
淘淘小庄园增加了1间书房
淘淘小庄园增加了1间厨房
淘淘小庄园增加了1间K吧
淘淘小庄园增加了1个花园
淘淘小庄园增加了1堵围墙
我是淘淘小庄园, 我可供观赏,也可用来游玩!
Process finished with exit code 0
```
## 什么是构建模式?
> 将一复杂对象的构建过程和它的表现分离,使得同样的构建过程可以获取(创建)不同的表现。
1. 像搭积木一样,把不同的部件拼装成自己想要的东西的过程,就是一个构建过程。
2. 构建顾名思义就是把各种部件通过一定的方式和流程构造成一个成品的过程。
![](https://box.kancloud.cn/dc1a183a6226a350d2d06d86cc273e48_744x303.png)
## 构建模式与工厂模式的区别
* 工厂模式关注的是整个产品(整体对象)的生成,即成品的生成;
* 而构建模式关注的是产品的创建过程和细节,一步一步地由各个子部件构创建一个成品。
* 比如要创建一辆汽车,如果用工厂模式,直接就创建出一辆有车身、轮胎、发动机的汽车。
* 如果用构建模式,则需要由车身、轮胎、发动机一步一步地组装成一辆汽车。
## 构建模式与组合模式的区别
> 组合模式关注“整体-部分”的关系,也是关注对象的内部组成结构
**区别**
* 组合模式关注的是对象内部的组成结构,强调的是部分与整体的关系。
* 构建模式关注的是对象的创建过程,有一个个子部件创建成一个成品的过程。
**联系**
* 组合模式和构建模式其实也经常被一起使用。
* 电脑组装的时候,内存卡(Memory Card)、硬盘(Hard Disk)、核心处理器(CPU)、电池(Battery)、风扇(Fan)都是独立的电子元件
* 主板(Mainboard)和机箱(Computer Case)都是由子元件组成的。
* 我们的 ComputerBuilder 就是构建者,负责整个电脑的组装过程
* 先把内存卡、硬盘、CPU 组装在主板上,再把主板、电池、风扇组装在机箱,最后连接鼠标、键盘、显示器,就构成了一个完整的台式电脑。
## 优缺点
**构建模式的优点**:
1. 将产品(对象)的创建过程与产品(对象)本身分离开来,让使用方(调用者)可以用相同的创建过程创建不同的产品(对象)。
1. 将对象的创建过程单独分解出来,使得创建过程更加清晰,能够更加精确的控制复杂对象的创建过程。
1. 针对升级版的构建模式,每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者。
**构建模式的缺点**:
1. 增加了很多的创建类,如果产品的类型和种类比较多,将会增加很多类,使整个系统变得更加庞杂。
1. 产品之间的结构相差很大时,构建模式将很难适应。
## 应用场景
1. 产品(对象)的创建过程比较复杂,希望将产品的创建过程和它本身的功能分离开来。
1. 产品有很多种类,每个种类之间内部结构比较类似,但有很多差异;不同的创建顺序或不同的组合方式,将创建不同的产品。