将一个复杂对象的创建与表示分离,使得同样的构建过程可以创建不同的表示.

应用场景:

A.创建这个对象通常需要较多的参数,才能完整的表示该对象.
B.类的各个组成部分的具体实现类或算法经常面临变化,但将他们组合在一起却相对稳定,提供一种封装机制 将稳定的组合算法于易变的各个组成部分隔离开来.
C.不同的创建方式或参数,可以在同一个类上表示相对不同的对象.(如创建一个person类,年龄小的速度快的为年轻人,年龄大的速度慢的为老年人)

为什么需要建造者模式:
* 1.创建这个对象,通常比较复杂,需要给予过多的参数,才能完成创建.
* 2.对象的生成时可根据初始化的顺序或数据不同,而生成不同角色

UML图

示例代码一:

class Person
{
protected $age;
protected $speed; public function setAge($age)
{
$this->age = $age;
} public function setSpeed($speed)
{
$this->speed = $speed;
} public function getAge()
{
return $this->age;
} public function getSpeed()
{
return $this->speed;
}
} abstract class Builder
{
protected $person;
public function __construct(Person $person)
{
$this->person = $person;
} public function getPerson()
{
return $this->person;
} abstract public function setAge();
abstract public function setSpeed();
} class OldManBuilder extends Builder
{
public function setAge()
{
$this->person->setAge(70);
} public function setSpeed()
{
$this->person->setSpeed(10);
}
} class ChildBuilder extends Builder
{
public function setAge()
{
$this->person->setAge(10);
} public function setSpeed()
{
$this->person->setSpeed(10);
}
} // 建造指挥者
class Director
{
private $builder; public function __construct(Builder $builder)
{
$this->builder = $builder;
} public function built()
{
$this->builder->setAge();
$this->builder->setSpeed();
}
} // 建造
$old = new OldManBuilder(new Person());
$director = new Director($old);
$director->built(); $person = $old->getPerson(); echo $person->getAge();

  

示例代码二:

class Person
{
private $name, $age; public function setName($name){
$this->name = $name;
} public function setAge($age) {
$this->age = $name;
}
} 如果我们要使该类"完整",必须调用setName和setAge. class Builder
{
private $person;
private $configs public function __construct($configs)
{
$this->person = new Person();
$this->configs = $configs;
} // 将person的多个方法都放在此方法中执行.
public function build()
{
$this->person->setName($config['name']);
$this->person->setAge($config['age']);
} public function getPerson()
{
return $this->person;
}
} // 调用
$build = new Build(array('name' => 'php', 'age' => 10));
$build->build();
$person = $person->getPerson();

  

ps:建造者模式依然是创建型模式之一,依然强调的是一个类的创建.这是它区别于外观模式的区别.

C3:建造者模式 Builder的更多相关文章

  1. 【原】iOS设计模式之:建造者模式Builder Pattern,用于改进初始化参数

    本文主要讨论一下iOS中的Builder Pattern.与网上很多版本不同,本文不去长篇大论地解释建造者模式的概念,那些东西太虚了.设计模式这种东西是为了解决实际问题的,不能为了设计模式而设计模式, ...

  2. 乐在其中设计模式(C#) - 建造者模式(Builder Pattern)

    原文:乐在其中设计模式(C#) - 建造者模式(Builder Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 建造者模式(Builder Pattern) 作者:webabc ...

  3. 建造者模式(Builder)-宏观的使用角度

    建造者模式(Builder) 建造者模式是用来解决产品对象的创建过程是由多个零件组成的情况,这些零件与产品本身是组合关系,也就是部分与整体,这些零件的创建顺序,还有一些创建中的逻辑,都是稳定的,可以封 ...

  4. 【设计模式】建造者模式 Builder Pattern

    前面学习了简单工厂模式,工厂方法模式以及抽象工厂模式,这些都是创建类的对象所使用的一些常用的方法和套路, 那么如果我们创建一个很复杂的对象可上面的三种方法都不太适合,那么“专业的事交给专业人去做”,2 ...

  5. 建造者模式(Builder Pattern)

    建造者模式(Builder Pattern) 它可以将多个简单的对象一步一步构建成一个复杂的对象. 意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示. 主要解决:主要解决在软 ...

  6. 二十四种设计模式:建造者模式(Builder Pattern)

    建造者模式(Builder Pattern) 介绍将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 示例用同样的构建过程创建Sql和Xml的Insert()方法和Get()方 ...

  7. iOS设计模式之:建造者模式Builder Pattern,用于改进初始化参数

    转自:http://www.cnblogs.com/wengzilin/p/4365855.html 本文主要讨论一下iOS中的Builder Pattern.与网上很多版本不同,本文不去长篇大论地解 ...

  8. 建造者模式(Builder)——从组装电脑开始

    建造者模式(Builder)--从组装电脑开始 建造者模式概括起来就是将不同独立的组件按照一定的条件组合起来构成一个相对业务完整的对象.调用者无需知道构造的过程. 我们从组装电脑开始 让我们从买组装电 ...

  9. 设计模式—建造者模式(Builder)

    title: 设计模式-建造者模式 建造者模式(Builder)是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节.建造者模式属于对 ...

随机推荐

  1. Oracle 数据库维护相关

    版本升级 在维护数据库升级的过程中,会产生n个脚本.谈谈我所处的项目背景,项目数据库最早版本假定为1,最后在多次维护后,版本号,可能变更为16.那么针对项目上不同的数据库版本,如何来进行升级呢? 我使 ...

  2. [9018_1592]USACO 2014 Open Silver Fairphoto

    题目描述 Farmer John's N cows (1 <= N <= 100,000) are standing at various positions along a long o ...

  3. usb驱动的基本结构和函数简介【转】

    转自:http://blog.csdn.net/jeffade/article/details/7698404 几个重要的结构 struct--接口 struct usb_interface { /* ...

  4. 在线查看PDF文档

    http://www.cnblogs.com/morang/p/4598894.html http://78re52.com1.z0.glb.clouddn.com/resource%2Fscenar ...

  5. PostgreSQL备份和恢复数据表

    备份数据表: pg_dump -U user_name db_name -t table_name -f /tmp/backup_file.suffix 恢复数据表: 方法1: 登录数据库:\i /t ...

  6. 小白书 黑白图像【DFS/Flood Fill】

    http://blog.csdn.net/u010470972/article/details/33415617 Description 输入一个n×n的黑白图像(1表示黑色,0表示白色),任务是统计 ...

  7. 详解xml

    xml xml简介 XML是一种可扩展标记语言 (Extensible Markup Language, XML).是一种可扩展的标记语言,XML重在数据交换,用于不同平台或者应用程序之间交换数据,存 ...

  8. viewflipper的高度设置

    由于ViewFlipper的一个子view是这个ImageView,ViewFilpper在切换时,高度总是为子View中高度最大的值作为其高度值. 后经搜索,发现需要设置android:measur ...

  9. POJ2955 Brackets(区间DP)

    给一个括号序列,求有几个括号是匹配的. dp[i][j]表示序列[i,j]的匹配数 dp[i][j]=dp[i+1][j-1]+2(括号i和括号j匹配) dp[i][j]=max(dp[i][k]+d ...

  10. 可持久化线段树(主席树)(图文并茂详解)【poj2104】【区间第k大】

    [pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=63740442 向大(hei)佬(e)实力学(di ...