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

应用场景:

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 整理

    高效分页 select * from ( select rownum r,a from yourtable order by name ) --之所以没有把<=20放在最外面,也就是我一直用的写 ...

  2. 【查看linux配置】查看linux系统常用的命令,Linux查看系统配置常用命令

    一.linux CPU大小  cat /proc/cpuinfo |grep "model name" && cat /proc/cpuinfo |grep &qu ...

  3. springMVC多图片压缩上传的实现

    首先需要在配置文件中添加配置: <!--配置文件的视图解析器,用于文件上传,其中ID是固定的:multipartResolver--> <bean id="multipar ...

  4. laravel中建立公共视图的方法

    1.用法概要 @include('common.header') 包含子视图 @extends('article.common.base') 继承基础模板 @yield('content') 视图占位 ...

  5. Struts2 学习笔记——struts.xml文件之Bean的配置

    Struts2的大部分核心组件不是以硬编码的形式写在代码中,而是通过自身的IoC容器来管理的. Struts2以可配置的形式来管理核心组件,所以开发者可以很容易的扩展框架的核心组件.当开发者需要扩展或 ...

  6. C# 事件和Unity3D

    http://zijan.iteye.com/blog/871207 翻译自: http://www.everyday3d.com/blog/index.php/2010/10/04/c-events ...

  7. iOS 自定义字体设置

    有时候客户都要求使用方正兰亭刊黑字体,可是iOS没有自带这个字体,肿么办 ,只能自己自定义字体了,下面是自定义字体的几个重要步骤: 1.下载字体资源文件(.ttf或.otf格式的文件) 比如说你要使用 ...

  8. Linux守护进程的启动方法(转)

    作者: 阮一峰 日期: 2016年2月28日 "守护进程"(daemon)就是一直在后台运行的进程(daemon). 本文介绍如何将一个 Web 应用,启动为守护进程. 一.问题的 ...

  9. PHP 让__get方法重新执行

    <?php class A { public function __get($p) { echo "getting $p\r\n"; if(isset($this->$ ...

  10. 虚拟机拷贝之后,发现系统内的开机自启动的nginx,不能自启动了

    因业务需要,同事以某个虚拟机为模板,复制出其他的CentOS虚拟机时,发现原系统内的开机自启动的nginx,不能再自启动了. 好吧,那就重新注册一下 nginx 的开机自启动: # 先删除原来的注册: ...