设计模式之建造者模式(php实现)
github地址:https://github.com/ZQCard/design_pattern
/**
* 建造者模式
* 将一个复杂对象的建造与调用者分离。调用者只需要给出指定对象的类型和内容,建造者模式负责按照顺寻创建复杂对象.
* 以买汽车为例,工厂负责制造汽车,你可以购买你所需要的汽车品牌和型号
* 指挥者(Director):将复杂对象划分为各个详情对象的建造请求(厂长)
* 建造请求(Builder):将复杂对象划分为各个详情对象的建造请求(轮子、座椅、发动机)
* 具体的建造者:建造属于自己的产品部件(轮子制造人,座椅制造人,发动机制造人)
* 优点:易于解耦,将产品本身与创建的过程分离,可以使用相同的创建过程来创建不同的产品.
* 易于精确的控制对象,将复杂对象的创建划分在不同的方法中,创建过程更加清晰
* 易于扩展,增加新的建造者无需修改原来的类库
* 缺点:建造者模式的产品具有较多的共同点,组成部分类似。如果产品之间差异较大,则不适合
* 如果产品的内部变化复杂,需要定义更多具体的建造者来配合,导致系统变的庞大
*/
(1)Builer.class.php 建造抽象父类(用于规范子类方法)
<?php
namespace Builder; // 抽象接口 定义装配汽车的流水线
abstract class Builder
{
// 造轮子
public abstract function buildWheel(); // 造椅子
public abstract function buildChair(); // 造发动机
public abstract function buildEngine(); // 组装完成
public abstract function getCar();
}
(2)Director.class.php 指挥类(用于指挥具体建造者工作)
<?php namespace Builder; // 厂长安排工人装配
class Director
{
public function assemble(Builder $builder){
$builder->buildChair();
$builder->buildWheel();
$builder->buildEngine();
}
}
(3)Car.class.php (具体产品类)
<?php namespace Builder; class Car
{
private $buildList = []; public function add($part)
{
$this->buildList[] = $part;
} public function show(){
foreach ($this->buildList as $key => $builder){
echo "组件 " . $builder . " 安装好了".'<br/>';
}
print_r("组装完毕");
}
}
(4)ConcreteBuiler.class.php(具体建造者1号,用于建造普通汽车)
<?php namespace Builder; class ConcreteBuilder extends Builder
{ private $car; public function __construct()
{
$this->car = new Car();
} public function buildChair()
{
$this->car->add('装椅子');
} public function buildWheel()
{
$this->car->add('装轮子');
} public function buildEngine()
{
$this->car->add('装引擎');
} public function getCar()
{
return $this->car;
}
}
(5)ConcreteBuiler.class.php(具体建造者2号,用于建造好汽车)
<?php namespace Builder; class ConcreteBuilder2 extends Builder
{
private $car; public function __construct()
{
$this->car = new Car();
} public function buildWheel()
{
$this->car->add('造好轮子');
} public function buildChair()
{
$this->car->add("造好椅子");
} public function buildEngine()
{
$this->car->add("造好引擎");
} public function getCar()
{
return $this->car;
}
}
(6)builder.class.php(客户端)
<?php
/**
* 建造者模式
* 将一个复杂对象的建造与调用者分离。调用者只需要给出指定对象的类型和内容,建造者模式负责按照顺寻创建复杂对象.
* 以买汽车为例,工厂负责制造汽车,你可以购买你所需要的汽车品牌和型号
* 指挥者(Director):将复杂对象划分为各个详情对象的建造请求(厂长)
* 建造请求(Builder):将复杂对象划分为各个详情对象的建造请求(轮子、座椅、发动机)
* 具体的建造者:建造属于自己的产品部件(轮子制造人,座椅制造人,发动机制造人)
* 优点:易于解耦,将产品本身与创建的过程分离,可以使用相同的创建过程来创建不同的产品.
* 易于精确的控制对象,将复杂对象的创建划分在不同的方法中,创建过程更加清晰
* 易于扩展,增加新的建造者无需修改原来的类库
* 缺点:建造者模式的产品具有较多的共同点,组成部分类似。如果产品之间差异较大,则不适合
* 如果产品的内部变化复杂,需要定义更多具体的建造者来配合,导致系统变的庞大
*/ spl_autoload_register(function ($className){
$className = str_replace('\\','/',$className);
include $className.".class.php";
}); use Builder\Director;
use Builder\ConcreteBuilder;
use Builder\ConcreteBuilder2;
// 指挥者
$director = new Director();
// 具体建造者1
$builder = new ConcreteBuilder(); $director->assemble($builder); $car = $builder->getCar();
//var_dump($car); // 具体建造者2
$builder2 = new ConcreteBuilder2();
$director->assemble($builder2); $car2 = $builder2->getCar();
var_dump($car2);
设计模式之建造者模式(php实现)的更多相关文章
- Java设计模式之建造者模式(Builder)
前言: 最近一直在学习okHttp,也对其做了一些整理,okHttp和Retrofit结合大大加速我们的开发效率,源码里面采用了很多设计模式,今天我们来学习一下其中的设计模式之一建造者模式. 建造者模 ...
- C#设计模式(5)——建造者模式(Builder Pattern)
一.引言 在软件系统中,有时需要创建一个复杂对象,并且这个复杂对象由其各部分子对象通过一定的步骤组合而成.例如一个采购系统中,如果需要采购员去采购一批电脑时,在这个实际需求中,电脑就是一个复杂的对象, ...
- 【GOF23设计模式】建造者模式
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]建造者模式详解类图关系 建造飞船 package com.test.Builder; public class AirShi ...
- C++设计模式之建造者模式(三)
4.引入钩子方法的建造者模式 建造者模式除了逐步构建一个复杂产品对象外.还能够通过Director类来更加精细地控制产品的创建过程.比如添加一类称之为钩子方法(HookMethod)的特殊方法来控制是 ...
- 乐在其中设计模式(C#) - 建造者模式(Builder Pattern)
原文:乐在其中设计模式(C#) - 建造者模式(Builder Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 建造者模式(Builder Pattern) 作者:webabc ...
- 折腾Java设计模式之建造者模式
博文原址:折腾Java设计模式之建造者模式 建造者模式 Separate the construction of a complex object from its representation, a ...
- C#设计模式之四建造者模式(Builder Pattern)【创建型】
一.引言 今天我们要讲讲Builder模式,也就是建造者模式,当然也有叫生成器模式的,英文名称是Builder Pattern.在现实生活中,我们经常会遇到一些构成比较复杂的物品,比如:电脑,它就是一 ...
- Java 设计模式之建造者模式(四)
原文地址:Java 设计模式之建造者模式(四) 博客地址:http://www.extlight.com 一.前言 今天继续介绍 Java 设计模式中的创建型模式--建造者模式.上篇设计模式的主题为 ...
- GOF23设计模式之建造者模式
GOF23设计模式之建造者模式 场景: 我们要建造一个复杂的产品.比如:神州飞船,Iphone.这个复杂的产品的创建.有这样的一个问题需要处理: 装配这些子组件是不是有个步骤问题? 实际开发中,我们所 ...
- java设计模式3——建造者模式
java设计模式3--建造者模式 1.建造者模式介绍: 建造者模式属于创建型模式,他提供了一种创建对象得最佳方式 定义: 将一个复杂对象的构建和与它的表示分离,使得同样的构建过程可以创建不同的表示 主 ...
随机推荐
- docker 生成新的镜像
下载了ubuntu的初始化镜像,但是没有网络安装包,安装了字后,如果生成新的镜像 sudo docker commit -m "add ifconfig/ping package" ...
- 【bzoj3289】Mato的文件管理 离散化+莫队算法+树状数组
原文地址:http://www.cnblogs.com/GXZlegend/p/6805224.html 题目描述 Mato同学从各路神犇以各种方式(你们懂的)收集了许多资料,这些资料一共有n份,每份 ...
- [bzoj4945][Noi2017]游戏
题目大意:有$n$个位置,有三种数,每个位置只可以填一种数,$d(d\leqslant8)$个位置有三种选择,其他位置只有两种选择.有一些限制,表示第$i$个位置选了某种数,那么第$j$个位置就只能选 ...
- JS DOM对象与jQuery对象的转换
JS转jQuery // 直接用$()来包裹 如同$(this) $(document) var jsObj = document.getElementById('test'); var jquery ...
- 牛客 NOIp模拟1 T3 保护 解题报告
保护 题目描述 \(C\)国有\(n\)个城市,城市间通过一个树形结构形成一个连通图.城市编号为\(1\)到\(n\),其中\(1\)号城市为首都.国家有\(m\)支军队,分别守卫一条路径的城市.具体 ...
- 接水果(fruit)
接水果(fruit) 风见幽香非常喜欢玩一个叫做 osu! 的游戏,其中她最喜欢玩的模式就是接水果.由于她已经 DT FC 了 The big black,她觉得这个游戏太简单了,于是发明了一个更加难 ...
- Easy Install详细参数
Easy Install Easy Install is a python module (easy_install) bundled with setuptools that lets you au ...
- 戴文的Linux内核专题:02 源代码【转】
转自:https://linux.cn/article-2190-1.html?pr 在下载并解压内核源代码后,用户可以看到许多文件夹和文件.尝试去找一个特定的文件或许是一个挑战.谢天谢地,源代码以一 ...
- UVA 10985 Rings'n'Ropes
最短路 参考了Staingger的博客 感觉DP的状态记录还是有毛病.可以DFS寻找结果也. #include <map> #include <set> #include &l ...
- 获取URL中的文件的扩展名
问题: 尽可能多地写出获取文件扩展名的方法: //方法一(分割数组) function getExt($url){ $arr = explode('.',$url); $len = count($ar ...