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);

设计模式之建造者模式(php实现)的更多相关文章

  1. Java设计模式之建造者模式(Builder)

    前言: 最近一直在学习okHttp,也对其做了一些整理,okHttp和Retrofit结合大大加速我们的开发效率,源码里面采用了很多设计模式,今天我们来学习一下其中的设计模式之一建造者模式. 建造者模 ...

  2. C#设计模式(5)——建造者模式(Builder Pattern)

    一.引言 在软件系统中,有时需要创建一个复杂对象,并且这个复杂对象由其各部分子对象通过一定的步骤组合而成.例如一个采购系统中,如果需要采购员去采购一批电脑时,在这个实际需求中,电脑就是一个复杂的对象, ...

  3. 【GOF23设计模式】建造者模式

    来源:http://www.bjsxt.com/ 一.[GOF23设计模式]建造者模式详解类图关系 建造飞船 package com.test.Builder; public class AirShi ...

  4. C++设计模式之建造者模式(三)

    4.引入钩子方法的建造者模式 建造者模式除了逐步构建一个复杂产品对象外.还能够通过Director类来更加精细地控制产品的创建过程.比如添加一类称之为钩子方法(HookMethod)的特殊方法来控制是 ...

  5. 乐在其中设计模式(C#) - 建造者模式(Builder Pattern)

    原文:乐在其中设计模式(C#) - 建造者模式(Builder Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 建造者模式(Builder Pattern) 作者:webabc ...

  6. 折腾Java设计模式之建造者模式

    博文原址:折腾Java设计模式之建造者模式 建造者模式 Separate the construction of a complex object from its representation, a ...

  7. C#设计模式之四建造者模式(Builder Pattern)【创建型】

    一.引言 今天我们要讲讲Builder模式,也就是建造者模式,当然也有叫生成器模式的,英文名称是Builder Pattern.在现实生活中,我们经常会遇到一些构成比较复杂的物品,比如:电脑,它就是一 ...

  8. Java 设计模式之建造者模式(四)

    原文地址:Java 设计模式之建造者模式(四) 博客地址:http://www.extlight.com 一.前言 今天继续介绍 Java 设计模式中的创建型模式--建造者模式.上篇设计模式的主题为 ...

  9. GOF23设计模式之建造者模式

    GOF23设计模式之建造者模式 场景: 我们要建造一个复杂的产品.比如:神州飞船,Iphone.这个复杂的产品的创建.有这样的一个问题需要处理: 装配这些子组件是不是有个步骤问题? 实际开发中,我们所 ...

  10. java设计模式3——建造者模式

    java设计模式3--建造者模式 1.建造者模式介绍: 建造者模式属于创建型模式,他提供了一种创建对象得最佳方式 定义: 将一个复杂对象的构建和与它的表示分离,使得同样的构建过程可以创建不同的表示 主 ...

随机推荐

  1. linux shell常用语法

    特殊变量 $0 当前脚本的文件名$n 传递给脚本或函数的参数.n 是一个数字,表示第几个参数.例如,第一个参数是$1,第二个参数是$2.$# 传递给脚本或函数的参数个数.$* 传递给脚本或函数的所有参 ...

  2. Codeforces Round #355 (Div. 2) C 预处理

    C. Vanya and Label time limit per test 1 second memory limit per test 256 megabytes input standard i ...

  3. HDU 5690 矩阵快速幂

    All X Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submi ...

  4. Oracle 对字符串去重函数

    CREATE OR REPLACE FUNCTION ZZMES."REMOVESAMESTR" (oldStr varchar2, sign varchar2) return v ...

  5. 几个简单的VBS脚本程序以及其JS实现

    1 语音发声脚本,调用sapi.spvoice读英语hh  保存为say.vbs,点击打开就可以念诗: set objTTS = CreateObject("sapi.spvoice&quo ...

  6. Asp .Net MVC中常用过滤属性类

    /// <summary> /// /// </summary> public class AjaxOnlyAttribute : ActionFilterAttribute ...

  7. flask框架基本使用(2)(响应与重定向)

    #转载请留言联系 flask 框架基本使用(1):https://www.cnblogs.com/chichung/p/9756935.html 1. flask 自定义返回状态码与响应头 from ...

  8. 在C#中调用格式工厂进行任意视频格式到FLV的转换

    1.下载安装格式工厂和完美解码器 2.运行格式工厂,转换一个RMVB到FLV,注意找个大点的,使时间长一些.防止在未执行步骤3时就结束了 3.在进程中查看某个进程的命令行参数是什么? wmic pro ...

  9. js-监听页面滚动

    两种监听页面滚动的方法 一.原生js通过window.onscroll监听 window.onscroll = function() { //为了保证兼容性,这里取两个值,哪个有值取哪一个 //scr ...

  10. ubuntu 安装TensorFlow

    1.安装pip $ sudo apt-get install python-pip python-dev 2.安装 TensorFlow for Python 2.7 # Ubuntu/Linux - ...