练代码,增加了调用时的输出。

<?php
/*
The builder pattern separates the construction of a complex object from its
representation, making it possible for the same construction process to create
different representations. While some creational patterns construct a product
in one call, builder pattern does it step by step under the control of the director.
*/

class Car {
    private $wheels;
    private $color;

    public function getWheels() {
        echo 'Car_getWheels<br/>';
        return $this->wheels;
    }

    public function setWheels($weels) {
        echo 'Car_setWheels<br/>';
        $this->wheels = $weels;
    }

    public function getColor() {
        echo 'Car_getColor<br/>';
        return $this->color;
    }

    public function setColor($color) {
        echo 'Car_setColor<br/>';
        $this->color = $color;
    }

    public function __toString() {
        return  'Color: ' . $this->color . '. Wheels: ' . $this->wheels;
    }

}

interface CarBuilderInterface {
    public function setColor($color);
    public function setWheels($wheels);
    public function getResult();
}

class CarBuilder implements CarBuilderInterface {
    private $car;

    public function __construct() {
        echo 'CarBuilder__construct<br/>';
        $this->car = new Car();
    }

    public function setColor($color){
        echo 'CarBuilder_setColor<br/>';
        $this->car->setColor($color);
        return $this;
    }
    public function setWheels($wheels){
        echo 'CarBuilder_setWheels<br/>';
        $this->car->setWheels($wheels);
        return $this;
    }
    public function getResult(){
        echo 'CarBuilder_getResult<br/>';
        return $this->car;
    }
}

class CarBuilderDirector {
    private $builder;

    public function __construct(CarBuilder $builder) {
        echo 'CarBuilderDirector__construct<br/>';
        $this->builder = $builder;
    }

    public function build() {
        echo 'CarBuilderDirector__build<br/>';
        $this->builder->setColor('Red');
        $this->builder->setWheels(4);
        return $this;
    }

    public function getCar() {
        echo 'CarBuilderDirector__getCar<br/>';
        return $this->builder->getResult();
    }
}

$carBuilder = new CarBuilder();
$carBuilderDirector = new CarBuilderDirector($carBuilder);
$car = $carBuilderDirector->build()->getCar();
echo $car;

?>

输出

CarBuilder__construct
CarBuilderDirector__construct
CarBuilderDirector__build
CarBuilder_setColor
Car_setColor
CarBuilder_setWheels
Car_setWheels
CarBuilderDirector__getCar
CarBuilder_getResult
Color: Red. Wheels: 4

php构建型模式(Builder pattern)的更多相关文章

  1. 构建者模式(Builder pattern)

    构建者模式应用场景: 主要用来构建一些复杂对象,这里的复杂对象比如说:在建造大楼时,需要先打牢地基,搭建框架,然后自下向上地一层一层盖起来.通常,在建造这种复杂结构的物体时,很难一气呵成.我们需要首先 ...

  2. 【设计模式】建造者模式 Builder Pattern

    前面学习了简单工厂模式,工厂方法模式以及抽象工厂模式,这些都是创建类的对象所使用的一些常用的方法和套路, 那么如果我们创建一个很复杂的对象可上面的三种方法都不太适合,那么“专业的事交给专业人去做”,2 ...

  3. 设计模式系列之建造者模式(Builder Pattern)——复杂对象的组装与创建

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

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

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

  5. 建造者模式(Builder Pattern)

    建造者模式(Builder Pattern) 它可以将多个简单的对象一步一步构建成一个复杂的对象. 意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示. 主要解决:主要解决在软 ...

  6. 二十四种设计模式:建造者模式(Builder Pattern)

    建造者模式(Builder Pattern) 介绍将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 示例用同样的构建过程创建Sql和Xml的Insert()方法和Get()方 ...

  7. 【原】iOS设计模式之:建造者模式Builder Pattern,用于改进初始化参数

    本文主要讨论一下iOS中的Builder Pattern.与网上很多版本不同,本文不去长篇大论地解释建造者模式的概念,那些东西太虚了.设计模式这种东西是为了解决实际问题的,不能为了设计模式而设计模式, ...

  8. iOS设计模式之:建造者模式Builder Pattern,用于改进初始化参数

    转自:http://www.cnblogs.com/wengzilin/p/4365855.html 本文主要讨论一下iOS中的Builder Pattern.与网上很多版本不同,本文不去长篇大论地解 ...

  9. Net设计模式实例之建造者模式(Builder Pattern)

    一.建造者模式简介(Brief Introduction) 建造者模式(Builder Pattern),将一个复杂对象的构建与它的表示分离,使的同样的构建过程可以创建不同的表示. 建造者模式的优点是 ...

随机推荐

  1. express框架,使用 static 访问 public 内静态文件

    使用 express 生成 node 服务器后,我们需要访问放在public文件夹内的静态文件,如上传的图片 我们需要在app.js中添加配置项: app.use('/public',express. ...

  2. 【视频开发】【计算机视觉】相机标定(Camera calibration)《二》

    简介 摄像机标定(Camera calibration)简单来说是从世界坐标系换到图像坐标系的过程,也就是求最终的投影矩阵 P 的过程,下面相关的部分主要参考UIUC的计算机视觉的课件(网址Sprin ...

  3. 模型区分度衡量指标-KS值

    1.KS值--学习器将正例和反例分开的能力,确定最好的“截断点” KS曲线和ROC曲线都用到了TPR,FPR.KS曲线是把TPR和FPR都作为纵坐标,而样本数作为横坐标.但是AUC只评价了模型的整体训 ...

  4. swig包里面没有找到swig.exe

    问题关键词: swig.exe找不到 swig.exe不存在 windows如何编译swig.exe windows如何生成swig.exe SWIG简单介绍: SWIG(http://www.swi ...

  5. Python【每日一问】33

    问: [基础题1]:设计一个重量转换器,输入以“g”为单位的数字后返回换算成“kg”的结果 [基础题2]:设计一个求直角三角形斜边长的函数,比如直角边长分别为3和4,输出结果为:The right t ...

  6. Java中的数据类型与运算符

    一.变量的命名 (1)什么是变量:变量是java中存储数据的空间. (2)变量命名的规则:由:数(数字),字(字母),下(下划线),美(美元符号),人(人名币符号)组成的标识符.注:数字不能作为首字母 ...

  7. Django 模板语言 变量名称

    Django 模板语言 变量名称 模板语言中已变量形式显示 # view 文件内 def func(request): return render(request,"index.html&q ...

  8. sqlserver apply

    IF OBJECT_ID('tb') IS NOT NULL DROP TABLE tb go CREATE TABLE tb(name VARCHAR(10),value VARCHAR(200)) ...

  9. Firefox 无法播放 youtube

    今天 firefox (目前是 67,之前刚装了 62 的时候也是这个问题..)升级之后,莫名其妙没法使用 youbube 了. 尝试了很多方法,我觉得可能是这条起作用了: 1. 关闭所有网页. 2. ...

  10. AnimationClip压缩-动画文件压缩

    动画压缩方法一.常用方法1. Rig->Animation Type:改为Generic2. Animations->Anim.Compression:Optimal二.高级方法1. 去掉 ...