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 Builder\Director;
use Builder\ConcreteBuilder;
use Builder\ConcreteBuilder2;

// 指挥者
$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);

最新文章

  1. Beginning Scala study note(6) Scala Collections
  2. java验证码刷新
  3. Java分布式开发
  4. Linux学习笔记15-YUM安装
  5. spring mvc拦截器和&lt;mvc:annotation-driven /&gt;的详解
  6. Android HttpHeader的坑
  7. MVVM框架思想
  8. SqlSever基础 两个条件 group by 分组显示
  9. iOS---RunLoop深度剖析
  10. JAVA之装饰者模式
  11. vc关于文件拷贝
  12. 接受POST表单传过来的信息 可以用foreach循环进行遍历操作
  13. microsoft
  14. spring拦截器的简单实现Interceptor
  15. linux添加环境变量(path)
  16. Shell Scripts - 条件语句,case语句,function功能
  17. 基于python脚本,实现Unity全平台的自动打包
  18. 解决安装TensorFlow GPU缺少文件的一个比较终极的办法
  19. golang使用 gzip压缩
  20. Year 2038 problem (2038年问题)

热门文章

  1. 使用common-fileUpload实现文件上传
  2. servlet 图片流
  3. PHP文件开头session_start()
  4. idea中新建的web项目不能新建servlet
  5. [codeforces] 97B Superset || 平面分治
  6. 电阻 (resistance)
  7. CI的多级目录的功能
  8. tips 前端 移动端 web iscroll 5 自译文档 api速查
  9. java.security.InvalidKeyException: IOException : Short read of DER length
  10. Html5学习进阶一 视频和音频