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

应用场景:

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:建造者模式依然是创建型模式之一,依然强调的是一个类的创建.这是它区别于外观模式的区别.

最新文章

  1. oracle中根据当前记录查询前一条和后一条记录
  2. 跟着思维导图学习javascript
  3. java通过LinkedList实现堆栈和队列数据结构
  4. maven pom.xml解释 (转)
  5. fstat - 读取文件相关信息
  6. (转)了解了这些才能开始发挥jQuery的威力
  7. ConnectivityManager与检查网络连接的使用
  8. 自动化测试之路3-selenium3+python3环境搭建
  9. 【Java】【10】后台处理Emoji表情
  10. [转]java 关于httpclient 请求https (如何绕过证书验证)
  11. Event对象中的target属性和currentTarget属性的区别
  12. Perl文件测试操作和stat函数
  13. LDAP1-安装部署LDAP服务
  14. PXE(preboot execution environment):【网络】预启动执行环节:引导 live光盘 ubuntu livecd 18.04+:成功
  15. WebSocket和long poll、ajax轮询的区别,ws协议测试
  16. 教程:如何手动安装Xamarin与Xamarin for VisualStudio
  17. performSelector 的缺点
  18. eclipse 安装Subversion1.82(SVN)插件
  19. Webpack学习错误解决笔记
  20. oracle autotrace使用

热门文章

  1. tips 前端 各个设备的页面尺寸的media query 与页面高度的经验总结
  2. 百度之星初赛(A)——T6
  3. 无法安装MVC3,一直卡在vs10-kb2483190
  4. sql server创建外键,子母表,级联删除。
  5. WPF中的URI
  6. linux中高端内存和低端内存的概念【转】
  7. redis 单机模拟 cluster集群
  8. XXXX公司微课大赛技术储备
  9. Weblogic 监控工具汇总及简介
  10. Reporting Services的简单使用