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. android中常见的Drawable资源有哪些?

    Drawable资源是安卓应用中最常见的一种资源,比如图片等,因此,对于初学者而言,必须掌握drawable资源相关应用. 今天在网上刚好看到了一篇介绍android Drawable资源的文章,分享 ...

  2. java中unmodifiableList方法的应用场景

    java对象中primitive类型变量可以通过不提供set方法保证不被修改,但对象的List成员在提供get方法后,就可以随意add.remove改变其结构,这不是希望的结果.网上看了下,发现Col ...

  3. BeanUtils Date

    在jdbc封装(基础的CRUD)的时候(查询一条数据,查询多条数据,更新....)经常会用到一个BeanUtil来设置属性值,当对象中存在Date类型的时候,会报错:如下: 2017-11-03 13 ...

  4. java GUI Graphics2D 绘图

    Graphics类提供基本绘图方法,Graphics2D类提供更强大的绘图能力.本节讲解Graphics类,下节讲解Graphics2D. Graphics类提供基本的几何图形绘制方法,主要有:画线段 ...

  5. [Codeforces 1027 F] Session in BSU [并查集维护二分图匹配问题]

    题面 传送门 思路 真是一道神奇的题目呢 题目本身可以转化为二分图匹配问题,要求右半部分选择的点的最大编号最小的一组完美匹配 注意到这里左边半部分有一个性质:每个点恰好连出两条边到右半部分 那么我们可 ...

  6. ZOJ 1280 Interesting Lines | 求两直线交点

    原题: 求两直线交点 思路借鉴于:http://blog.csdn.net/zxy_snow/article/details/6341282 感谢大佬 #include<cstdio> # ...

  7. BZOJ1079 [SCOI2008]着色方案 【dp记忆化搜索】

    题目 有n个木块排成一行,从左到右依次编号为1~n.你有k种颜色的油漆,其中第i种颜色的油漆足够涂ci个木块. 所有油漆刚好足够涂满所有木块,即c1+c2+-+ck=n.相邻两个木块涂相同色显得很难看 ...

  8. Three Garlands~Educational Codeforces Round 35

    C. Three Garlands time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...

  9. Audio Unit 介绍

    关于 Audio Unit iOS 提供了音频处理插件,支持混音,声音均衡,格式转化,以及用于录音,回放,离线渲染,实时对话的输入输出.可以动态载入和使用这些强大而灵活的插件,在 iOS 应用中这些插 ...

  10. vue中动态循环model

    vue动态循环model与angular有所不同,angular直接定义一个数组,然后传入循环列表的index即可. 而vue不仅需要定义一个数组,还需要通过接口读出循环的数组长度,然后在create ...