建造者模式:
  造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

  建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。建造者模式属于对象创建型模式。根据中文翻译的不同,建造者模式又可以称为生成器模式。

目的:
  消除其他对象复杂的创建过程
建造者模式包含如下角色:
  1.产品角色,产品角色定义自身的组成属性
  2.抽象建造者,抽象建造者定义了产品的创建过程以及如何返回一个产品
  3.具体建造者,具体建造者实现了抽象建造者创建产品过程的方法,给产品的具体属性进行赋值定义
  4.指挥者,指挥者负责与调用客户端交互,决定创建什么样的产品

UML图:

  

//代码实现:

<?php
class People{
public $head;
public $body; //不太此类中直接给属性赋值
function __construct(){ }
} //定义具备建造者所需实现的方法
abstract class PeopleBuilder{
abstract function buildHead();
abstract function buildBody();
} //具体建造类实现具体业务
class ChildBuilder extends PeopleBuilder{
private $people;
function __construct(){
$this->people = new people;
} function buildHead(){
echo "this is a child's head!";
}
function buildBody(){
echo "this is a child's body!";
}
function returnResult(){
return $this->people;
}
} class AdultBuilder extends PeopleBuilder{
private $people;
function __construct(){
$this->people = new people;
} function buildHead(){
echo "this is a adult's head!";
}
function buildBody(){
echo "this is a adult's body!";
}
function returnResult(){
return $this->people;
}
} //指挥者,指挥者负责与调用客户端交互,决定创建什么样的产品
class Director{
function __construct(Peoplebuilder $builder){
$builder->buildHead();
$builder->buildBody();
}
} //测试
$builder = new AdultBuilder();
$director = new Director($builder);
$person = $builder->returnResult();
//this is a adult's head! this is a adult's body!
?>

优点:
  建造者模式可以很好的将一个对象的实现与相关的“业务”逻辑分离开来,从而可以在不改变事件逻辑的前提下,使增加(或改变)实现变得非常容易。
缺点:
  建造者接口的修改会导致所有执行类的修改。
适用场景:
  1、 需要生成的产品对象有复杂的内部结构。
  2、 需要生成的产品对象的属性相互依赖,建造者模式可以强迫生成顺序。
  3、 在对象创建过程中会使用到系统中的一些其它对象,这些对象在产品对象的创建过 程中不易得到。
使用建造者模式主要有以下效果:
  1、 建造者模式的使用使得产品的内部表象可以独立的变化。使用建造者模式可以使客 户端不必知道产品内部组成的细节。
  2、 每一个Builder都相对独立,而与其它的Builder无关。
  3、 模式所建造的最终产品更易于控制。

建造者模式以及php实现的更多相关文章

  1. 23种设计模式--建造者模式-Builder Pattern

    一.建造模式的介绍       建造者模式就是将零件组装成一个整体,用官方一点的话来讲就是将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示.生活中比如说组装电脑,汽车等等这些都是建 ...

  2. PHP设计模式(五)建造者模式(Builder For PHP)

    建造者模式:将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示的设计模式. 设计场景: 有一个用户的UserInfo类,创建这个类,需要创建用户的姓名,年龄,爱好等信息,才能获得用 ...

  3. java设计模式之建造者模式

    学习了设计模式,一直感觉有进步又没有进步,与同学.同事探讨了一下.变化不可能一会就可以的,需要努力坚持.不管进步大小,也不管是否进步,做到勿忘初心,做自己喜欢的事情就好.还有几个设计模式一直没有写,原 ...

  4. 设计模式--建造者模式Builder(创建型)

    一.首先看建造者模式的UML图: 二.再来看一个建造者模式的例子 class Builder { public: virtual void BuildHead() {} virtual void Bu ...

  5. C#设计模式之建造者模式

    建造者模式可以将部件本身和它们的组装过程分开,关注如何一步步创建一个包含多个组成部分的复杂对象,用户只需要指定复杂对象的类型即可得到该对象,而无须知道其内部的具体构造细节. 建造者模式:将一个复杂对象 ...

  6. C#设计模式-建造者模式

    在软件系统中,有时需要创建一个复杂对象,并且这个复杂对象由其各部分子对象通过一定的步骤组合而成. 例如一个采购系统中,如果需要采购员去采购一批电脑时,在这个实际需求中,电脑就是一个复杂的对象,它是由C ...

  7. C#设计模式系列:建造者模式(Builder)

    1.建造者模式简介 1.1>.定义 建造者模式(Builder)将复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示. 1.2>.使用频率 中低 1.3>.原型模式应用 ...

  8. Java设计模式之建造者模式(Builder)

    前言: 最近一直在学习okHttp,也对其做了一些整理,okHttp和Retrofit结合大大加速我们的开发效率,源码里面采用了很多设计模式,今天我们来学习一下其中的设计模式之一建造者模式. 建造者模 ...

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

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

  10. 设计模式(五)建造者模式(Builder Pattern)

    一.引言 在软件系统中,有时需要创建一个复杂对象,并且这个复杂对象由其各部分子对象通过一定的步骤组合而成.例如一个采购系统中,如果需要采购员去采购一批电脑时,在这个实际需求中,电脑就是一个复杂的对象, ...

随机推荐

  1. linux nginx service nginx restart [fail]

    命令:nginx -t 查看失败原因: nginx: [emerg] "fastcgi_pass" directive is duplicate in /etc/nginx/sit ...

  2. Android NDK 环境搭建

    使用最新ndk,直接抛弃cygwin,曾经做Android的项目要用到NDK就必需要下载NDK,下载安装Cygwin(模拟Linux环境用的),下载CDT(Eclipse C/C++开发插件),还要配 ...

  3. java里int类型转byte类型

    今天在做书上的一个例子的时候, 要使用byte类型,首先我很直接的就写到了byte b = 0XAA, 结果报错, 说从int转换到byte可能会有损失. 我当时就很奇怪, 为什么会出现这种情况呢? ...

  4. 基于开源项目的在线网络视频直播项目---pc端的推流

    https://github.com/winlinvip/simple-rtmp-server/issues/66 https://github.com/justinmakaila/iOS-Frame ...

  5. ClassLoader如何加载class

    jvm里有多个类加载,每个类加载可以负责加载特定位置的类, 例如: bootstrap类加载负责加载jre/lib/rt.jar中的类, 我们平时用的jdk中的类都位于rt.jar中. extclas ...

  6. 现在企业流行的java框架技术

    我将简短分析被用于支持这些框架的企业开发环境或工具箱,例如Borland JBuilder,Eclipse以及BEA Workbench.请记住,市场上有许多有关这些开发框架的图书;然而,在任何一篇文 ...

  7. 自己写好的pdo数据库抽象层 mysql为例

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/qq1355541448/article/details/31787719 class pdo_dat ...

  8. js控制页面显示

    两个菜单切换显示页面内容: js控制代码, /** JS初始化 **/ $(document).ready(function() { $('#email_btn').click(function(){ ...

  9. 关于树论【LCA树上倍增算法】

    补了一发LCA,表示这东西表面上好像简单,但是细节真挺多. 我学的是树上倍增,倍增思想很有趣~~(爸爸的爸爸叫奶奶.偶不,爷爷)有一个跟st表非常类似的东西,f[i][j]表示j的第2^i的祖先,就是 ...

  10. string operation in powershell

    https://blogs.technet.microsoft.com/heyscriptingguy/2014/07/15/keep-your-hands-clean-use-powershell- ...