1 模式介绍
是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
2 模式中的角色
1. builder:给出一个抽象接口,以规范产品对象的各个组成成分的建造。这个接口规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建。
2. ConcreteBuilder:实现Builder接口,针对不同的商业逻辑,具体化复杂对象的各部分的创建。 在建造过程完成后,提供产品的实例。
3. Director:调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建。
4. Product:要创建的复杂对象。
3 模式结构
4 项目
4.1 设计一个车的组装过程
4.2 类设计
4.3 源码设计
<?php
/**
* 建造者模式
* copyright (c) http://blog.csdn.net/CleverCode
*/
//需要建造的产品(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();
}/*}}}*/
//红旗车builder
class RedBuilder 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;
}
}/*}}}*/
//QQ车builder
class QQBuilder implements IBuilder
{/*{{{*/
public $car;
public function __construct()
{
$this->car = new Car();
}
public function builderName()
{
$this->car->setName('QQ');
}
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)
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();
$redBuilder = new RedBuilder();
$car = $director->make($redBuilder);
$car->show();
echo "\r\n";
$qqBuilder = new QQBuilder();
$car = $director->make($qqBuilder);
$car->show();
}
}/*}}}*/
Client::main($argv);
?>
4.4 结果
技术交流
CleverCode是一名架构师,技术交流,咨询问题,请加CleverCode创建的qq群(架构师俱乐部):517133582。加群和腾讯,阿里,百度,新浪等公司的架构师交流。【架构师俱乐部】宗旨:帮助你成长为架构师!