学习php设计模式 php实现建造者模式


Posted in PHP onDecember 07, 2015

建造者模式可以让一个产品的内部表象和和产品的生产过程分离开,从而可以生成具有不同内部表象的产品。
一、Builder模式结构图

 学习php设计模式 php实现建造者模式

二、Builder模式中主要角色
抽象建造者(Builder)角色:定义一个抽象接口,规范产品各个组成成分的建造(即规范具体建造者的方法实现)。其中所规范的方法中必须包括建造方法和结果返回方法
具体建造者(ConcreteBuilder)角色:实现抽象建造者角色所定义的方法。具体建造者与业务逻辑关联性较大,应用程序最终会通过调用此角色中所实现的建造方法按照业务逻辑创建产品,在建造完成后通过结果返回方法返回建造的产品实例。一般在外部由客户或一个抽象工厂创建。
导演者(Director)角色:此角色的作用是调用具体的建造者角色建造产品。导演者与产品类没有直接关系,与产品类交谈的是具体抽象角色。
产品(Product)角色:在指导者的指导下由建造者所创建的那个复杂的对象
导演者角色与客户端直接打交道,它理解客户端的业务逻辑,将客户端创建产品的请求拆分成对产品组成部分的请求,然后调用具体产品角色执行建造操作。它分离了客户端与具体建造者。
三、Builder模式的优缺点
Builder模式的优点: 建造者模式可以很好的将一个对象的实现与相关的“业务”逻辑分离开来,从而可以在不改变事件逻辑的前提下,使增加(或改变)实现变得非常容易。
Builder模式的缺点: 建造者接口的修改会导致所有执行类的修改。
四、Builder模式的使用场景与效果
以下情况应当使用建造者模式:
1、 需要生成的产品对象有复杂的内部结构。
2、 需要生成的产品对象的属性相互依赖,建造者模式可以强迫生成顺序。
3、 在对象创建过程中会使用到系统中的一些其它对象,这些对象在产品对象的创建过程中不易得到。
使用建造者模式主要有以下效果:
1、 建造者模式的使用使得产品的内部表象可以独立的变化。使用建造者模式可以使客户端不必知道产品内部组成的细节。
2、 每一个Builder都相对独立,而与其它的Builder无关。
3、 模式所建造的最终产品更易于控制。
五、Builder模式与其它模式
抽象工厂模式(abstract factory模式):在抽象工厂模式中,每一次工厂对象被调用时都会返还一个完整的产品对象,而客户端可能会将这些产品组装成一个更大更复杂的产品,也可能不会。建造者模式则不同,它一点一点地建造出一个复杂的产品,而这个产品的组装过程发生在建造者内部。二者的区别在于是否有组装过程,组装过程发生的位置。这两个设计模式可以连起来用,客户端通过调用一个建造角色,间接调用另一个抽象工厂模式的工厂角色。工厂模式返还不同产品族的零件,而建造者模式则把它们组装起来。

策略模式(strategy模式):建造者模式在结构上很接近于策略模式,事实上建造者模式是策略模式的一种特殊情况。二者的区别在于用意不同。建造者模式作用于客户端一点一点的建造新的对象,而策略模式的目的是为算法提供抽象的接口。

建造者模式与模板方法模式:建造者模式在退化、失去导演者角色后,可以发展到模板方法模式(即将建造过程的算法实现放在建造角色中)。

建造者模式与合成模式:合成模式描述一个对象树的组成结构,而建造者模式则可以用来描述对象树的生成过程。
以上4点来自《Java与模式》
六、Builder模式PHP示例

<?php
/**
 * 产品
 * 此处仅以一个产品类中的字符串演示产品
 */
class Product {
 /**
 * 产品的组成部分集合
 */
 private $_parts;
 
 public function __construct() {
 $this->_parts = array();
 }
 
 public function add($part) {
 return array_push($this->_parts, $part);
 }
 
 public function show() {
 echo "the product include:";
 array_map('printf', $this->_parts);
 }
}
 
/**
 * 抽象建造者 
 */
abstract class Builder {
 
 /**
 * 产品零件构造方法1
 */
 public abstract function buildPart1();
 
 
 /**
 * 产品零件构造方法2
 */
 public abstract function buildPart2();
 
 
 /**
 * 产品返还方法
 */
 public abstract function getResult();
}
 
/**
 * 具体建造者
 */
class ConcreteBuilder extends Builder {
 
 private $_product;
 
 public function __construct() {
 $this->_product = new Product();
 }
 
 public function buildPart1() {
 $this->_product->add("Part1");
 }
 
 public function buildPart2() {
 $this->_product->add("Part2");
 }
 
 public function getResult() {
 return $this->_product;
 }
}
 
/**
 * 导演者
 */
class Director {
 
 public function __construct(Builder $builder) {
 $builder->buildPart1();
 $builder->buildPart2();
 }
}
 
 
 
class Client {
 
 /**
 * Main program.
 */
 public static function main() {
 $buidler = new ConcreteBuilder();
 $director = new Director($buidler);
 $product = $buidler->getResult();
 $product->show();
 }
 
}
 
Client::main();
?>

以上就是使用php实现建造者模式的代码,还有一些关于建造者模式的概念区分,希望对大家的学习有所帮助。

PHP 相关文章推荐
第十五节--Zend引擎的发展
Nov 16 PHP
PHP 中文处理技巧
Apr 25 PHP
解决PhpMyAdmin中导入2M以上大文件限制的方法分享
Jun 06 PHP
php合并数组中相同元素的方法
Nov 13 PHP
php使用GD创建保持宽高比缩略图的方法
Apr 17 PHP
php计算两个坐标(经度,纬度)之间距离的方法
Apr 17 PHP
postfixadmin忘记密码后的修改密码方法详解
Jul 20 PHP
Thinkphp框架中D方法与M方法的区别
Dec 23 PHP
php使用imagecopymerge()函数创建半透明水印
Jan 25 PHP
PHP实现可精确验证身份证号码的工具类示例
May 31 PHP
PHP的PDO错误与错误处理
Jan 27 PHP
laravel5表单唯一验证的实例代码
Sep 30 PHP
学习php设计模式 php实现访问者模式(Visitor)
Dec 07 #PHP
PHP面向对象详解(三)
Dec 07 #PHP
php生成高清缩略图实例详解
Dec 07 #PHP
php冒泡排序与快速排序实例详解
Dec 07 #PHP
PHP常用工具类大全附全部代码下载
Dec 07 #PHP
PHP+ajax分页实例简析
Dec 07 #PHP
php 升级到 5.3+ 后出现的一些错误,如 ereg(); ereg_replace(); 函数报错
Dec 07 #PHP
You might like
php下实现在指定目录搜索指定类型文件的函数
2008/10/03 PHP
10个实用的PHP代码片段
2011/09/02 PHP
ThinkPHP模版中导入CSS和JS文件的方法
2014/11/29 PHP
Yii Framework框架开发微信公众平台示例
2020/04/26 PHP
PHP设计模式(三)建造者模式Builder实例详解【创建型】
2020/05/02 PHP
在IE模态窗口中自由查看HTML源码的方法
2007/03/08 Javascript
jQuery实现用方向键控制层的上下左右移动
2013/01/13 Javascript
jquery对table中各数据的增加、保存、删除操作示例
2014/05/14 Javascript
javascript实现在网页任意处点左键弹出隐藏菜单的方法
2015/05/13 Javascript
AngularJs 弹出模态框(model)
2016/04/07 Javascript
深入理解js promise chain
2016/05/05 Javascript
js多功能分页组件layPage使用方法详解
2016/05/19 Javascript
Angularjs 自定义服务的三种方式(推荐)
2016/08/02 Javascript
Javascript json object 与string 相互转换的简单实现
2016/09/27 Javascript
微信小程序 表单Form实例详解(附源码)
2016/12/22 Javascript
js实现带简单弹性运动的导航条
2017/02/22 Javascript
JavaScript定义函数_动力节点Java学院整理
2017/06/27 Javascript
详解vue-cli 2.0配置文件(小结)
2019/01/14 Javascript
Vue 实现CLI 3.0 + momentjs + lodash打包时优化
2019/11/13 Javascript
解决vue单页面 回退页面 keeplive 缓存问题
2020/07/22 Javascript
使用js和canvas实现时钟效果
2020/09/08 Javascript
[48:56]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 VG vs KG
2018/03/31 DOTA
python登录豆瓣并发帖的方法
2015/07/08 Python
Python输出带颜色的字符串实例
2017/10/10 Python
Python判断对象是否相等及eq函数的讲解
2019/02/25 Python
Python 用matplotlib画以时间日期为x轴的图像
2019/08/06 Python
Python自动化办公Excel模块openpyxl原理及用法解析
2020/11/05 Python
纽约JewelryAffairs珠宝店:精细金银时尚首饰
2017/02/05 全球购物
Ralph Lauren法国官网:美国高品味时装品牌
2017/12/08 全球购物
报关简历自我评价怎么写
2013/09/19 职场文书
冰淇淋店的创业计划书
2014/02/07 职场文书
2014两会学习心得:时代的发展
2014/03/17 职场文书
党建工作经验交流材料
2014/05/25 职场文书
批评与自我批评范文
2014/10/15 职场文书
论群众路线学习心得体会
2014/10/31 职场文书
PyMongo 查询数据的实现
2021/06/28 Python