### 定義
使用多個簡單的對象一步一步構建成一個復雜的對象。這種類型的設計模式屬于創建型模式,它提供了一種創建對象的最佳方式。
### 作用
將一個復雜的構建與其表示相分離,使得同樣的構建過程可以創建不同的表示。
### 使用場景
制造汽車。
### 優、缺點
優點:
建造者獨立,易擴展;
便于控制細節風險。
缺點:
產品必須有共同點,范圍有限制;
如內部變化復雜,會有很多的建造類。
### 模式結構
(略)
### 示例類圖
建造者模式包含幾個角色:
* Builder:抽象建造者類,規范產品的組件,一般是由子類實現。
* ConcreteBuilder:具體建造者類,實現抽象類定義的所有方法,并且返回一個組建好的對象。
* Director:指揮者(組裝者)類,負責安排已有模塊的順序,然后告訴Builder開始建造。
* Product:產品類,通常是實現了模板方法模式,也就是有模板方法和基本方法。
:-: 
### 示例代碼
* 產品類 (Product)
```
class Car
{
public $name;
public $engine;//發動機
public $chassis;//底盤
public $body;//車身
public $equipment;//電器設備
public function setName($name)
{
$this->name = $name;
}
public function setEngine($engine)
{
$this->engine = $engine;
}
public function setChassis($chassis)
{
$this->chassis = $chassis;
}
public function setBody($body)
{
$this->body = $body;
}
public function setEquipment($equipment)
{
$this->equipment = $equipment;
}
public function show()
{
echo "名稱:".$this->name."\r\n";
echo "引擎:".$this->engine."\r\n";
echo "底盤:".$this->chassis."\r\n";
echo "車身:".$this->body."\r\n";
echo "電子設備:".$this->equipment."\r\n";
}
}
```
* 抽象建造者類 (Builder)
```
interface IBuilder
{
public function builderName();
public function builderEngine();
public function builderChassis();
public function builderBody();
public function builderEquipment();
public function getCar();
}
```
* 具體建造者類 (ConcreteBuilder)
```
// 寶馬車builder
class BMWBuilder implements IBuilder
{
public $car;
public function __construct()
{
$this->car = new Car();
}
public function builderName()
{
$this->car->setName('寶馬');
}
public function builderEngine()
{
$this->car->setEngine('德國發動機');
}
public function builderChassis()
{
$this->car->setChassis('超大底盤');
}
public function builderBody()
{
$this->car->setBody('超大');
}
public function builderEquipment()
{
$this->car->setEquipment('電子設備');
}
public function getCar()
{
return $this->car;
}
}
```
```
// 本田車builder
class HondaBuilder implements IBuilder
{
public $car;
public function __construct()
{
$this->car = new Car();
}
public function builderName()
{
$this->car->setName('本田');
}
public function builderEngine()
{
$this->car->setEngine('日本發動機');
}
public function builderChassis()
{
$this->car->setChassis('小底盤');
}
public function builderBody()
{
$this->car->setBody('小');
}
public function builderEquipment()
{
$this->car->setEquipment('電子設備');
}
public function getCar()
{
return $this->car;
}
}
```
* 組裝者類 (Director)
```
// 組裝者(director)
class CarDirector
{
public function make(IBuilder $builder)
{
$builder->builderName();
$builder->builderEngine();
$builder->builderChassis();
$builder->builderBody();
$builder->builderEquipment();
return $builder->getCar();
}
}
```
* 客戶端調用
```
class Client
{
public static function main($argv)
{
$director = new CarDirector();
$bmwBuilder = new BMWBuilder();
$car = $director->make($bmwBuilder);
$car->show();
echo "\r\n";
$hondaBuilder = new HondaBuilder();
$car = $director->make($hondaBuilder);
$car->show();
}
}
Client::main($argv);
```
* 運行結果
```
名稱:寶馬
引擎:德國發動機
底盤:超大底盤
車身:超大
電子設備:電子設備
名稱:本田
引擎:日本發動機
底盤:小底盤
車身:小
電子設備:電子設備
```
* * * * *
### 注意事項
* 與工廠模式的區別是:建造者模式更加關注與零件裝配的順序。