github地址:https://github.com/ZQCard/design_pattern
/** * 建造者模式 * 将一个复杂对象的建造与调用者分离。调用者只需要给出指定对象的类型和内容,建造者模式负责按照顺寻创建复杂对象. * 以买汽车为例,工厂负责制造汽车,你可以购买你所需要的汽车品牌和型号 * 指挥者(Director):将复杂对象划分为各个详情对象的建造请求(厂长) * 建造请求(Builder):将复杂对象划分为各个详情对象的建造请求(轮子、座椅、发动机) * 具体的建造者:建造属于自己的产品部件(轮子制造人,座椅制造人,发动机制造人) * 优点:易于解耦,将产品本身与创建的过程分离,可以使用相同的创建过程来创建不同的产品. * 易于精确的控制对象,将复杂对象的创建划分在不同的方法中,创建过程更加清晰 * 易于扩展,增加新的建造者无需修改原来的类库 * 缺点:建造者模式的产品具有较多的共同点,组成部分类似。如果产品之间差异较大,则不适合 * 如果产品的内部变化复杂,需要定义更多具体的建造者来配合,导致系统变的庞大 */
(1)Builer.class.php 建造抽象父类(用于规范子类方法)
<?php namespace Builder; // 抽象接口 定义装配汽车的流水线 abstract class Builder { // 造轮子 public abstract function buildWheel(); // 造椅子 public abstract function buildChair(); // 造发动机 public abstract function buildEngine(); // 组装完成 public abstract function getCar(); }
(2)Director.class.php 指挥类(用于指挥具体建造者工作)
<?php namespace Builder; // 厂长安排工人装配 class Director { public function assemble(Builder $builder){ $builder->buildChair(); $builder->buildWheel(); $builder->buildEngine(); } }
(3)Car.class.php (具体产品类)
<?php namespace Builder; class Car { private $buildList = []; public function add($part) { $this->buildList[] = $part; } public function show(){ foreach ($this->buildList as $key => $builder){ echo "组件 " . $builder . " 安装好了".'<br/>'; } print_r("组装完毕"); } }
(4)ConcreteBuiler.class.php(具体建造者1号,用于建造普通汽车)
<?php namespace Builder; class ConcreteBuilder extends Builder { private $car; public function __construct() { $this->car = new Car(); } public function buildChair() { $this->car->add('装椅子'); } public function buildWheel() { $this->car->add('装轮子'); } public function buildEngine() { $this->car->add('装引擎'); } public function getCar() { return $this->car; } }
(5)ConcreteBuiler.class.php(具体建造者2号,用于建造好汽车)
<?php namespace Builder; class ConcreteBuilder2 extends Builder { private $car; public function __construct() { $this->car = new Car(); } public function buildWheel() { $this->car->add('造好轮子'); } public function buildChair() { $this->car->add("造好椅子"); } public function buildEngine() { $this->car->add("造好引擎"); } public function getCar() { return $this->car; } }
(6)builder.class.php(客户端)
<?php /** * 建造者模式 * 将一个复杂对象的建造与调用者分离。调用者只需要给出指定对象的类型和内容,建造者模式负责按照顺寻创建复杂对象. * 以买汽车为例,工厂负责制造汽车,你可以购买你所需要的汽车品牌和型号 * 指挥者(Director):将复杂对象划分为各个详情对象的建造请求(厂长) * 建造请求(Builder):将复杂对象划分为各个详情对象的建造请求(轮子、座椅、发动机) * 具体的建造者:建造属于自己的产品部件(轮子制造人,座椅制造人,发动机制造人) * 优点:易于解耦,将产品本身与创建的过程分离,可以使用相同的创建过程来创建不同的产品. * 易于精确的控制对象,将复杂对象的创建划分在不同的方法中,创建过程更加清晰 * 易于扩展,增加新的建造者无需修改原来的类库 * 缺点:建造者模式的产品具有较多的共同点,组成部分类似。如果产品之间差异较大,则不适合 * 如果产品的内部变化复杂,需要定义更多具体的建造者来配合,导致系统变的庞大 */ spl_autoload_register(function ($className){ $className = str_replace('\','/',$className); include $className.".class.php"; }); use BuilderDirector; use BuilderConcreteBuilder; use BuilderConcreteBuilder2;
// 指挥者 $director = new Director(); // 具体建造者1 $builder = new ConcreteBuilder(); $director->assemble($builder); $car = $builder->getCar(); //var_dump($car); // 具体建造者2 $builder2 = new ConcreteBuilder2(); $director->assemble($builder2); $car2 = $builder2->getCar(); var_dump($car2);