[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. 構建顧名思義就是把各種部件通過一定的方式和流程構造成一個成品的過程。

## 構建模式與工廠模式的區別
* 工廠模式關注的是整個產品(整體對象)的生成,即成品的生成;
* 而構建模式關注的是產品的創建過程和細節,一步一步地由各個子部件構創建一個成品。
* 比如要創建一輛汽車,如果用工廠模式,直接就創建出一輛有車身、輪胎、發動機的汽車。
* 如果用構建模式,則需要由車身、輪胎、發動機一步一步地組裝成一輛汽車。
## 構建模式與組合模式的區別
> 組合模式關注“整體-部分”的關系,也是關注對象的內部組成結構
**區別**
* 組合模式關注的是對象內部的組成結構,強調的是部分與整體的關系。
* 構建模式關注的是對象的創建過程,有一個個子部件創建成一個成品的過程。
**聯系**
* 組合模式和構建模式其實也經常被一起使用。
* 電腦組裝的時候,內存卡(Memory Card)、硬盤(Hard Disk)、核心處理器(CPU)、電池(Battery)、風扇(Fan)都是獨立的電子元件
* 主板(Mainboard)和機箱(Computer Case)都是由子元件組成的。
* 我們的 ComputerBuilder 就是構建者,負責整個電腦的組裝過程
* 先把內存卡、硬盤、CPU 組裝在主板上,再把主板、電池、風扇組裝在機箱,最后連接鼠標、鍵盤、顯示器,就構成了一個完整的臺式電腦。
## 優缺點
**構建模式的優點**:
1. 將產品(對象)的創建過程與產品(對象)本身分離開來,讓使用方(調用者)可以用相同的創建過程創建不同的產品(對象)。
1. 將對象的創建過程單獨分解出來,使得創建過程更加清晰,能夠更加精確的控制復雜對象的創建過程。
1. 針對升級版的構建模式,每一個具體建造者都相對獨立,而與其他的具體建造者無關,因此可以很方便地替換具體建造者或增加新的具體建造者。
**構建模式的缺點**:
1. 增加了很多的創建類,如果產品的類型和種類比較多,將會增加很多類,使整個系統變得更加龐雜。
1. 產品之間的結構相差很大時,構建模式將很難適應。
## 應用場景
1. 產品(對象)的創建過程比較復雜,希望將產品的創建過程和它本身的功能分離開來。
1. 產品有很多種類,每個種類之間內部結構比較類似,但有很多差異;不同的創建順序或不同的組合方式,將創建不同的產品。