C3:建造者模式 Builder
将一个复杂对象的创建与表示分离,使得同样的构建过程可以创建不同的表示.
应用场景:
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的更多相关文章
- 【原】iOS设计模式之:建造者模式Builder Pattern,用于改进初始化参数
本文主要讨论一下iOS中的Builder Pattern.与网上很多版本不同,本文不去长篇大论地解释建造者模式的概念,那些东西太虚了.设计模式这种东西是为了解决实际问题的,不能为了设计模式而设计模式, ...
- 乐在其中设计模式(C#) - 建造者模式(Builder Pattern)
原文:乐在其中设计模式(C#) - 建造者模式(Builder Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 建造者模式(Builder Pattern) 作者:webabc ...
- 建造者模式(Builder)-宏观的使用角度
建造者模式(Builder) 建造者模式是用来解决产品对象的创建过程是由多个零件组成的情况,这些零件与产品本身是组合关系,也就是部分与整体,这些零件的创建顺序,还有一些创建中的逻辑,都是稳定的,可以封 ...
- 【设计模式】建造者模式 Builder Pattern
前面学习了简单工厂模式,工厂方法模式以及抽象工厂模式,这些都是创建类的对象所使用的一些常用的方法和套路, 那么如果我们创建一个很复杂的对象可上面的三种方法都不太适合,那么“专业的事交给专业人去做”,2 ...
- 建造者模式(Builder Pattern)
建造者模式(Builder Pattern) 它可以将多个简单的对象一步一步构建成一个复杂的对象. 意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示. 主要解决:主要解决在软 ...
- 二十四种设计模式:建造者模式(Builder Pattern)
建造者模式(Builder Pattern) 介绍将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 示例用同样的构建过程创建Sql和Xml的Insert()方法和Get()方 ...
- iOS设计模式之:建造者模式Builder Pattern,用于改进初始化参数
转自:http://www.cnblogs.com/wengzilin/p/4365855.html 本文主要讨论一下iOS中的Builder Pattern.与网上很多版本不同,本文不去长篇大论地解 ...
- 建造者模式(Builder)——从组装电脑开始
建造者模式(Builder)--从组装电脑开始 建造者模式概括起来就是将不同独立的组件按照一定的条件组合起来构成一个相对业务完整的对象.调用者无需知道构造的过程. 我们从组装电脑开始 让我们从买组装电 ...
- 设计模式—建造者模式(Builder)
title: 设计模式-建造者模式 建造者模式(Builder)是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节.建造者模式属于对 ...
随机推荐
- MFC 按钮
((CButton *)GetDlgItem(IDC_RADIO1))->SetCheck(TRUE);//选上 ((CButton *)GetDlgItem(IDC_RADIO1))-> ...
- Git 新项目关联到远程仓库
最近前端学到小有成果,准备写一个新项目放在githup,结果没有提前在仓库创建项目,现在我把写好的项目推送到远程gitHup 1.先初始化本地仓库 Git init : 这样在项目里面都创建了一个隐藏 ...
- log4j配置文件动态指定日志文件名称
我们在项目当中经常会使用log4j进行日志记录,偶尔会遇到一些要求,比如日志文件名称按照启动参数动态配置,而不去修改log4j.xml,比较简单的一种做法是,通过设置系统属性的方式实现,代码: if( ...
- 虚拟机linux 挂载windows共享目录 给linux的nginx服务器使用
mount -t cifs -o username=administrator,password=xxxx,file_mode=0777,dir_mode=0777 //192.168.xx.xxx/ ...
- hdu 5158(水题)
Have meal Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- c++ set容器排序准则
转载两篇博客: http://blog.csdn.net/lishuhuakai/article/details/51404214 http://blog.csdn.net/lihao21/artic ...
- 针对各地项目icomet停止服务的临时处理办法
1.编辑一个脚本 vi /usr/local/watchicomet.sh #!/bin/bash sn=`ps -ef | grep ./icomet-server | grep -v grep | ...
- JAVA版拆分大整数为2幂的和算法
import java.util.ArrayList; import java.util.List; public class StrTest { public static void main(St ...
- Codeforces Gym100952 D. Time to go back-杨辉三角处理组合数 (2015 HIAST Collegiate Programming Contest)
D. Time to go back time limit per test 1 second memory limit per test 256 megabytes input standard ...
- unittest (python标准库-开发工具-单元测试框架)
unittest官方文档摘录 翻译 reffer to: https://docs.python.org/3/library/unittest.html#unittest.TextTestRunner ...