建造者模式(Builder For PHP)

5人阅读 评论(0) 收藏 举报
分类:

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

设计场景:

  1. 有一个用户的UserInfo类,创建这个类,需要创建用户的姓名,年龄,爱好等信息,才能获得用户具体的信息结果。
  2. 创建一个UserBuilder 用户建造者类,这个类,将UserInfo复杂的创建姓名,年龄,爱好等操作封装起来,简化用户类的创建过程

 

这是一个用户类

复制代码
class UserInfo
{
    protected $_userName;
    protected $_userAge;
    protected $_userHobby;

    public function setUserName($userName)
    {
        $this->_userName = $userName;
    }

    public function setUserAge($userAge)
    {
        $this->_userAge = $userAge;
    }

    public function setUserHobby($userHobby)
    {
        $this->_userHobby = $userHobby;
    }

    public function getPeopleInfo()
    {
        echo  "<br>这个人的名字是:" . $this->_userName . "<br>年龄为:" . $this->_userAge . "<br>爱好:" . $this->_userHobby;
    }
}
复制代码

这时候我们要获取一个用户的信息,过程是这样的:

$modelUser = new UserInfo();
$modelUser->setUserName('松涛');
$modelUser->setUserAge('23');
$modelUser->setUserHobby('推理小说');
$modelUser->getPeopleInfo();

得到的结果是:

这个人的名字是:松涛
年龄为:23
爱好:推理小说

 

这时候创建一个用户建造者类

复制代码
class UserBuilder
{
    protected $_obj;

    public function __construct()
    {
        $this->_obj = new UserInfo();
    }

    public function builderPeople($userInfo)
    {
        $this->_obj->setUserName($userInfo['userName']);
        $this->_obj->setUserAge($userInfo['userAge']);
        $this->_obj->setUserHobby($userInfo['userHobby']);
    }

    public function getBuliderPeopleInfo()
    {
        $this->_obj->getPeopleInfo();
    }
}
复制代码

这个是将复杂的创建过程封装在了builderPeople这个方法里面。 接下来是创建对象:

复制代码
$userArr = array(
    'userName' => '松涛',
    'userAge' => '23',
    'userHobby' => '推理小说');

$modelUserBuilder = new UserBuilder();
$modelUserBuilder->builderPeople($userArr);
$modelUserBuilder->getBuliderPeopleInfo();
复制代码

输出结果为:

这个人的名字是:松涛
年龄为:23
爱好:推理小说

优点

  • 简化复杂对象构建,对象本身与创建过程解耦,无需知道具体的 
    内部实现细节,相同的创建过程可以创建不同的产品对象;
  • 建造者模式可以很好的将一个对象的实现与相关的“业务”逻辑分离开来,从而可以在不改变事件逻辑的前提下,使增加(或改变)实现变得非常容易。

缺点

  • 可能会产生多余的建造者和构建过程对象,消耗内存;
  • 不适用与内部建造顺序不稳定,变化复杂的对象,可能导致需要 
    创建很多具体建造者来实现这些变化。
  • 建造者接口的修改会导致所有执行类的修改。

以下情况应当使用建造者模式:

1、 需要生成的产品对象有复杂的内部结构。
2、 需要生成的产品对象的属性相互依赖,建造者模式可以强迫生成顺序。
3、 在对象创建过程中会使用到系统中的一些其它对象,这些对象在产品对象的创建过程中不易得到。

根据以上例子,我们可以得到建造者模式的效果:
1、 建造者模式的使用使得产品的内部表象可以独立的变化。使用建造者模式可以使客户端不必知道产品内部组成的细节。
2、 每一个Builder都相对独立,而与其它的Builder(独立控制逻辑)无关。
3、 模式所建造的最终产品更易于控制。

 

建造者模式与工厂模式的区别:

我们可以看到,建造者模式与工厂模式是极为相似的,总体上,建造者模式仅仅只比工厂模式多了一个“导演类”的角色。在建造者模式的类图中,假如把这个导演类看做是最终调用的客户端,那么图中剩余的部分就可以看作是一个简单的工厂模式了。

与工厂模式相比,建造者模式一般用来创建更为复杂的对象,因为对象的创建过程更为复杂,因此将对象的创建过程独立出来组成一个新的类——导演类。也就是说,工厂模式是将对象的全部创建过程封装在工厂类中,由工厂类向客户端提供最终的产品;而建造者模式中,建造者类一般只提供产品类中各个组件的建造,而将具体建造过程交付给导演类。由导演类负责将各个组件按照特定的规则组建为产品,然后将组建好的产品交付给客户端。

查看评论

《软件创新——冲破高技术营造的牢笼》好书推荐

    过节在家,重新拾起一本名为《软件创新——冲破高技术营造的牢笼》的书。该书的作者是艾伦.库博,VB之父,一位从事软件开发30多年的先行者,却对现行的软件开发方法提出了严厉而深刻的批评(甚至包括业...
  • Musicwind
  • Musicwind
  • 2002-03-07 09:01:00
  • 1273

PHP设计模式——建造者模式

声明:本系列博客参考资料《大话设计模式》,作者程杰。        建造者模式也称生成器模式,核心思想是将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为...
  • jhq0113
  • jhq0113
  • 2015-04-25 11:30:51
  • 2810

设计模式(创建型)之建造者模式(Builder Pattern)

建造者模式将客户端与包含多个组成部分的复杂对象的创建过程分离,客户端压根不用知道复杂对象的内部组成部分与装配方式,只需要知道所需建造者的类型即可。它关注如何一步一步创建一个的复杂对象,不同的具体建造者...
  • yanbober
  • yanbober
  • 2015-04-28 16:38:56
  • 4894

JAVA设计模式之 建造者模式【Builder Pattern】

一、概述 二、适用
  • l416112167
  • l416112167
  • 2014-10-31 01:15:07
  • 3682

【java设计模式】之 建造者(Builder)模式

我们还是举上一节的例子:生产汽车。上一节我们通过模板方法模式控制汽车跑起来的动作,那么需求是无止境的,现在如果老板又增加了额外的需求:汽车启动、停止、鸣笛引擎声都由客户自己控制,他想要什么顺序就什么顺...
  • eson_15
  • eson_15
  • 2016-05-06 08:59:09
  • 5775

Android设计模式之建造者模式(builder pattern)

builder设计模式我们很常见,比如我们使用AlertDialog的时候就使用的builder设计模式,著名的Universal-Image-Loader的初始化配置也是使用的builder设计模式...
  • nugongahou110
  • nugongahou110
  • 2015-12-25 10:08:45
  • 3159

Java设计模式----建造者模式(Builder)

1.什么是建造者模式 无论是在现实世界中还是在软件系统中,都存在一些复杂的对象,它们拥有多个组成部分,如汽车,它包括车轮、方向盘、发送机等各种部件。而对于大多数用户而言,无须知道这些部件的装...
  • a1610770854
  • a1610770854
  • 2016-12-11 11:48:35
  • 312

Kotlin设计模式 - 建造者模式( Builder 模式)

Builder 模式 将复杂对象的构造与其表示分开,以便相同的构造过程可以创建不同形式的对象 Builder 模式很好用,可以避免臃肿的构造函数参数列表,还能方便地复用预先定义好的配置对象的代码。...
  • qq_30889373
  • qq_30889373
  • 2017-06-30 15:48:39
  • 725

浅谈JAVA设计模式之——建造者模式(Builder)

一、概述 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 二、适用性 1.当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。 2.当构造过程必须允许被...
  • l1028386804
  • l1028386804
  • 2015-05-02 21:22:38
  • 10351

建造者模式(Builder Pattern)- 最易懂的设计模式解析

前言今天我来全面总结一下Android开发中最常用的设计模式 -建造者模式。 其他设计模式介绍 1分钟全面了解“设计模式” 单例模式(Singleton) - 最易懂的设计模式解析 ...
  • carson_ho
  • carson_ho
  • 2017-02-07 15:41:21
  • 10143
    个人资料
    等级:
    访问量: 1129
    积分: 139
    排名: 119万+
    文章存档