学习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 相关文章推荐
用php来检测proxy
Oct 09 PHP
php 中文字符入库或显示乱码问题的解决方法
Apr 12 PHP
php开发留言板的CRUD(增,删,改,查)操作
Apr 19 PHP
解析php中如何直接执行SHELL
Jun 28 PHP
php解析json数据实例
Aug 19 PHP
Laravel 5框架学习之日期,Mutator 和 Scope
Apr 08 PHP
PHP将页面中点击数量高的链接进行高亮显示的方法
May 30 PHP
PHP正则匹配日期和时间(时间戳转换)的实例代码
Dec 14 PHP
Yii2框架中日志的使用方法分析
May 22 PHP
thinkPHP5.0框架事务处理操作简单示例
Sep 07 PHP
PHP随机数函数rand()与mt_rand()的讲解
Mar 25 PHP
php使用goto实现自动重启swoole、reactphp、workerman服务的代码
Apr 13 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
全国FM电台频率大全 - 4 山西省
2020/03/11 无线电
php 采集书并合成txt格式的实现代码
2009/03/01 PHP
Zend studio文件注释模板设置方法
2013/09/29 PHP
PHP下载生成的csv文件及问题总结
2015/08/06 PHP
基于PHP代码实现中奖概率算法可用于刮刮卡、大转盘等抽奖算法
2015/12/20 PHP
PHP pthreads v3在centos7平台下的安装与配置操作方法
2020/02/21 PHP
JavaScript 捕获窗口关闭事件
2009/07/26 Javascript
写出更好的JavaScript程序之undefined篇(中)
2009/11/23 Javascript
基于jquery的滚动条滚动固定div(附演示下载)
2012/10/29 Javascript
自己写了一个展开和收起的多更能型的js效果
2013/03/05 Javascript
js换图片效果可进行定时操作
2014/06/09 Javascript
JavaScript对数字的判断与处理实例分析
2015/02/02 Javascript
js事件监听器用法实例详解
2015/06/01 Javascript
玩转JavaScript OOP - 类的实现详解
2016/06/08 Javascript
JS实现密码框的显示密码和隐藏密码功能示例
2016/12/26 Javascript
Vue前端开发规范整理(推荐)
2018/04/23 Javascript
es6数据变更同步到视图层的方法
2019/03/04 Javascript
详解Vue 匿名、具名和作用域插槽的使用方法
2019/04/22 Javascript
M2实现Nodejs项目自动部署的方法步骤
2019/05/05 NodeJs
Vue对象赋值视图不更新问题及解决方法
2019/06/03 Javascript
jQuery与原生JavaScript选择HTML元素集合用法对比分析
2019/11/26 jQuery
node.js使用yargs处理命令行参数操作示例
2020/02/11 Javascript
Openlayers绘制地图标注
2020/09/28 Javascript
解决Ubuntu pip 安装 mysql-python包出错的问题
2018/06/11 Python
HTML5轻松实现全屏视频背景的示例
2018/04/23 HTML / CSS
Spartoo荷兰:鞋子、包包和服装
2018/07/12 全球购物
触发器(trigger)的功能都有哪些?写出一个触发器的例子
2012/09/17 面试题
音乐节策划方案
2014/06/09 职场文书
爱护花草树木的标语
2014/06/11 职场文书
领导班子作风建设剖析材料
2014/10/11 职场文书
2015毕业寄语大全
2015/02/26 职场文书
2015年“公民道德宣传日”活动方案
2015/05/06 职场文书
逃出克隆岛观后感
2015/06/09 职场文书
致短跑运动员加油稿
2015/07/21 职场文书
2016年国庆节宣传标语
2015/11/25 职场文书
2016继续教育培训学习心得体会
2016/01/19 职场文书