学习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 相关文章推荐
模拟SQLSERVER的两个函数:dateadd(),datediff()
Oct 09 PHP
兼容PHP5的PHP目录管理函数库
Jul 10 PHP
zen cart新进商品的随机排序修改方法
Sep 10 PHP
FireFox浏览器使用Javascript上传大文件
Oct 30 PHP
PHP基于php_imagick_st-Q8.dll实现JPG合成GIF图片的方法
Jul 11 PHP
PHP魔术引号所带来的安全问题分析
Jul 15 PHP
PHP+FastCGI+Nginx配置PHP运行环境
Aug 07 PHP
Smarty最简单实现列表奇偶变色的方法
Jul 01 PHP
php随机显示指定文件夹下图片的方法
Jul 13 PHP
thinkphp框架下404页面设置 仅三步
May 14 PHP
PHP在弹框中获取foreach中遍历的id值并传递给地址栏
Jun 13 PHP
PHP 获取客户端 IP 地址的方法实例代码
Nov 11 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 无限分类三种方式 非函数的递归调用!
2011/08/26 PHP
php自定义截取中文字符串-utf8版
2017/02/27 PHP
身份证号码前六位所代表的省,市,区, 以及地区编码下载
2007/04/12 Javascript
javascript 有趣而诡异的数组
2009/04/06 Javascript
jquery下实现overlay遮罩层代码
2010/08/25 Javascript
javascript attachEvent绑定多个事件执行顺序问题
2010/10/20 Javascript
JQuery 选择器、过滤器介绍
2011/02/14 Javascript
jquery监控数据是否变化(修正版)
2011/04/12 Javascript
jquery获取tr中控件值并操作tr实现思路
2013/03/27 Javascript
js获取系统的根路径实现介绍
2013/09/08 Javascript
jQuery的图片滑块焦点图插件整理推荐
2014/12/07 Javascript
用队列模拟jquery的动画算法实例
2015/01/20 Javascript
使用javaScript动态加载Js文件和Css文件
2015/10/24 Javascript
浅谈js中test()函数在正则中的使用
2016/08/19 Javascript
Vue.js每天必学之过滤器与自定义过滤器
2016/09/07 Javascript
JS表单数据验证的正则表达式(常用)
2017/02/18 Javascript
解决mpvue + vuex 开发微信小程序vuex辅助函数mapState、mapGetters不可用问题
2018/08/03 Javascript
vue实现简单的星级评分组件源码
2018/11/16 Javascript
微信小程序的线程架构【推荐】
2019/05/14 Javascript
Vue2.0 $set()的正确使用详解
2020/07/28 Javascript
python回调函数的使用方法
2014/01/23 Python
Python中的函数作用域
2018/05/07 Python
flask框架jinja2模板与模板继承实例分析
2019/08/01 Python
docker-py 用Python调用Docker接口的方法
2019/08/30 Python
pytorch实现对输入超过三通道的数据进行训练
2020/01/15 Python
Django 自定义404 500等错误页面的实现
2020/03/08 Python
python线程里哪种模块比较适合
2020/08/02 Python
详解scrapy内置中间件的顺序
2020/09/28 Python
前端canvas动画如何转成mp4视频的方法
2019/06/17 HTML / CSS
在HTML5 Canvas中放入图片和保存为图片的方法
2014/05/03 HTML / CSS
CAD制图人员的自荐信
2014/02/07 职场文书
报关员个人职业生涯规划书
2014/03/12 职场文书
小学生母亲节演讲稿
2014/05/07 职场文书
学习焦裕禄精神践行三严三实心得体会
2014/10/13 职场文书
环境卫生整治简报
2015/07/20 职场文书
领导干部学习十八届五中全会精神心得体会
2016/01/05 职场文书