### 定义
使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
### 作用
将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
### 使用场景
制造汽车。
### 优、缺点
优点:
建造者独立,易扩展;
便于控制细节风险。
缺点:
产品必须有共同点,范围有限制;
如内部变化复杂,会有很多的建造类。
### 模式结构
(略)
### 示例类图
建造者模式包含几个角色:
* Builder:抽象建造者类,规范产品的组件,一般是由子类实现。
* ConcreteBuilder:具体建造者类,实现抽象类定义的所有方法,并且返回一个组建好的对象。
* Director:指挥者(组装者)类,负责安排已有模块的顺序,然后告诉Builder开始建造。
* Product:产品类,通常是实现了模板方法模式,也就是有模板方法和基本方法。
:-: ![](https://box.kancloud.cn/a3147c7e4318334cbbeb71fdd3ee155b_506x463.bmp)
### 示例代码
* 产品类 (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);
```
* 运行结果
```
名称:宝马
引擎:德国发动机
底盘:超大底盘
车身:超大
电子设备:电子设备
名称:本田
引擎:日本发动机
底盘:小底盘
车身:小
电子设备:电子设备
```
* * * * *
### 注意事项
* 与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。