学习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 相关文章推荐
3
Oct 09 PHP
一个从别的网站抓取信息的例子(域名查询)
Oct 09 PHP
基于mysql的论坛(7)
Oct 09 PHP
从php核心代码分析require和include的区别
Jan 02 PHP
PHP在线生成二维码(google api)的实现代码详解
Jun 04 PHP
处理单名多值表单的详解
Jun 08 PHP
Php中使用Select 查询语句的实例
Feb 19 PHP
php递归方法实现无限分类实例代码
Feb 28 PHP
PHP批量去除BOM头内容信息代码
Mar 11 PHP
Symfony2中被遗弃的getRequest()方法分析
Mar 17 PHP
PHP判断是否微信访问的方法示例
Mar 27 PHP
php使用curl伪造浏览器访问操作示例
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
从MySQL数据库表中取出随机数据的代码
2007/09/05 PHP
PHP 获取文件权限函数介绍
2013/07/11 PHP
浅谈discuz密码加密的方式
2014/05/22 PHP
2010年最佳jQuery插件整理
2010/12/06 Javascript
JQuery入门——事件切换之toggle()方法应用介绍
2013/02/05 Javascript
jquery子元素过滤选择器使用示例
2013/06/24 Javascript
Firefox中通过JavaScript复制数据到剪贴板(Copy to Clipboard 跨浏览器版)
2013/11/22 Javascript
JS获取下拉框显示值和判断单选按钮的方法
2015/07/09 Javascript
Jquery+Ajax+PHP+MySQL实现分类列表管理(上)
2015/10/28 Javascript
基于jQuery实现二级下拉菜单效果
2016/02/01 Javascript
对jQuary选择器的全面总结
2016/06/20 Javascript
jQuery模拟Marquee实现无缝滚动效果完整实例
2016/09/29 Javascript
Vue数据驱动模拟实现5
2017/01/13 Javascript
微信小程序 详解下拉加载与上拉刷新实现方法
2017/01/13 Javascript
javascript 删除数组元素和清空数组的简单方法
2017/02/24 Javascript
JSON创建键值对(key是中文或者数字)方式详解
2017/08/24 Javascript
Angular 开发学习之Angular CLI的安装使用
2017/12/31 Javascript
JS div匀速移动动画与变速移动动画代码实例
2019/03/26 Javascript
Vue+Koa2+mongoose写一个像素绘板的实现方法
2019/09/10 Javascript
[04:12]第二届DOTA2亚洲邀请赛选手传记-Newbee.Sccc
2017/04/03 DOTA
使用Python求解最大公约数的实现方法
2015/08/20 Python
详解Python验证码识别
2016/01/25 Python
Python实现通过文件路径获取文件hash值的方法
2017/04/29 Python
Selenium环境变量配置(火狐浏览器)及验证实现
2020/12/07 Python
使用phonegap获取位置信息的实现方法
2017/03/31 HTML / CSS
美国婴童服装市场上的领先品牌:Carter’s
2018/02/08 全球购物
波兰运动鞋网上商店:Distance.pl
2020/07/30 全球购物
计算机毕业大学生推荐信
2013/12/01 职场文书
毕业自我评价
2014/02/05 职场文书
微信营销策划方案
2014/02/24 职场文书
低碳环保标语
2014/06/12 职场文书
销售人员求职信
2014/07/22 职场文书
2014年商场国庆节活动策划方案
2014/09/16 职场文书
2015年乡镇平安建设工作总结
2015/05/13 职场文书
酒店工程部的岗位职责汇总大全
2019/10/23 职场文书
Python 居然可以在 Excel 中画画你知道吗
2022/02/15 Python