php设计模式 — 建造者模式

需求分析:

我们接到了一个订单,是宝马公司和奔驰公司的,他们负责定义产品的零部件以及型号,我们负责生产,需求简单的描述就是这样。 我们需要为这个需求设计一个设计模式去更好的适应他们的需求。

首先我们需要一个车模型类,来定义好需要的所有零部件,这就叫做抽象类,之所以这样是因为我们还有可能接到更多公司的订单,比如劳斯莱斯,宾利。

然后由各自的车来继承这个抽象类,实现里面的方法。

接下来就需要一个建造者抽象类,来定义建造各自的车需要的方法

然后由各自车建造者来继承这个抽象类。

我们会想到一个建造模式了,不错,就是建造者模式。用它简直太合适了。看一下建造者的用例图

请注意:此图示例方法部分和我的示例对不上哦。

直接上代码:

  1 <?php
  2
  3 abstract class carModel{
  4
  5     //这里存储所有组装车需要的零件
  6     public $spareParts = array();
  7
  8     //车的名字
  9     public $carName = "";
 10
 11     //增加轮子部件
 12     public abstract function addLunzi($xinghao);
 13
 14     //增加外壳部件
 15     public abstract function addWaike($xinghao);
 16
 17     //增加发动机部件
 18     public abstract function addFadongji($xinghao);
 19
 20     //获取车,并给车取名字
 21     final public function getCar($carName){
 22         if($this->spareParts){
 23             $this->carName = $carName;
 24             //$k 代表部件名字
 25             //$v 代表型号
 26             foreach($this->spareParts as $k=>$v){
 27                 $actionName = "add" . $k;
 28                 $this->$actionName($v);
 29             }
 30         }else{
 31             throw new Exception("没有汽车部件");
 32
 33         }
 34     }
 35 }
 36
 37
 38 //定义具体的产品
 39 class bmwCarModel extends carModel{
 40
 41     public $spareParts = array();
 42     public $carName = "";
 43
 44     public function addLunzi($xinghao){
 45         echo "宝马".$this->carName."的轮子,型号是" . $xinghao . "\n";
 46     }
 47
 48     public function addWaike($xinghao){
 49         echo "宝马".$this->carName."的外壳,型号是" . $xinghao . "\n";
 50     }
 51
 52     public function addFadongji($xinghao){
 53         echo "宝马".$this->carName."的发动机,型号是 " . $xinghao . "\n";
 54     }
 55 }
 56
 57
 58 //定义具体的产品
 59 class benziCarModel extends carModel{
 60
 61     public $spareParts = array();
 62     public $carName = "";
 63
 64     public function addLunzi($xinghao){
 65         echo "奔驰".$this->carName."的轮子,型号是" . $xinghao . "\n";
 66     }
 67
 68     public function addWaike($xinghao){
 69         echo "奔驰".$this->carName."的外壳,型号是" . $xinghao . "\n";
 70     }
 71
 72     public function addFadongji($xinghao){
 73         echo "奔驰".$this->carName."的发动机,型号是 " . $xinghao . "\n";
 74     }
 75 }
 76
 77
 78
 79 //定义建造者
 80 abstract class carBuilder{
 81     public abstract function setSpareParts($partsName , $xinghao);
 82
 83     public abstract function getCarModel($name);
 84 }
 85
 86
 87 class bmwBuilder extends carBuilder{
 88     private $bmwModel;
 89
 90     public function __construct(){
 91         $this->bmwModel = new bmwCarModel();
 92     }
 93
 94     public function setSpareParts($partsName , $xinghao){
 95         $this->bmwModel->spareParts[$partsName] = $xinghao;
 96     }
 97
 98     public function getCarModel($name){
 99         $this->bmwModel->getCar($name);
100     }
101 }
102
103
104 class benziBuilder extends carBuilder{
105     private $benziModel;
106
107     public function __construct(){
108         $this->benziModel = new benziCarModel();
109     }
110
111     public function setSpareParts($partsName , $xinghao){
112         $this->bmwModel->spareParts[$partsName] = $xinghao;
113     }
114
115     public function getCarModel($name){
116         $this->bmwModel->getCar($name);
117     }
118 }
119
120
121
122 //模拟客户端调用
123
124 //创建一辆宝马车,取名字为宝马x1
125
126 $bmwBuilder = new bmwBuilder();
127 $bmwBuilder->setSpareParts(‘Lunzi‘ , ‘牛逼轮子1号‘);
128 $bmwBuilder->setSpareParts(‘Waike‘ , ‘牛逼外壳1号‘);
129 $bmwBuilder->setSpareParts(‘Fadongji‘ , ‘牛逼发动机1号‘);
130 $bmwBuilder->getCarModel("宝马x1");
131 $bmwBuilder->getCarModel("宝马x1");  //连续创建两个宝马x1
132
133 //再创建一个宝马 没有外壳 取名为 宝马s5
134 $bmwBuilder = new bmwBuilder();
135 $bmwBuilder->setSpareParts(‘Lunzi‘ , ‘牛逼轮子2号‘);
136 $bmwBuilder->setSpareParts(‘Fadongji‘ , ‘牛逼发动机2号‘);
137 $bmwBuilder->getCarModel("宝马s5");
138 $bmwBuilder->getCarModel("宝马s5");  //连续创建两个宝马x1

代码可以直接运行,你可以试着去生产一辆牛逼的奔驰车哦。

建造者模式的定义

建造者模式(Builder Pattern)也叫做生成器模式,其定义如下:

Separate the construction of a complex object from its representation so that the same construction process can create different representations. 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

建造者模式的通用类图如图所示。

在建造者模式中,有如下四个角色:

  • Product 产品类

通常是实现了模板方法模式,也就是有模板方法和基本方法,这个参考上一章节的模板方法模式。在例子中,BenzModel和BMWModel就属于产品类。

  • Builder 抽象建造者

规范产品的组建,一般是由子类实现。在例子中,CarBuilder属于抽象建造者。

  • ConcreteBuilder 具体建造者

实现抽象类定义的所有方法,并且返回一个组件好的对象。在例子中,BenzBuilder和BMWBuilder就属于具体建造者。

  • Director 导演

负责安排已有模块的顺序,然后告诉Builder开始建造,在上面的例子中就是我们的老大,牛叉公司找到老大,说我要这个,这个,那个类型的车辆模型,然后老大就把命令传递给我,我和我的团队就开始拼命的建造,于是一个项目建设完毕了。

时间: 2024-12-23 00:19:35

php设计模式 — 建造者模式的相关文章

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

title: 设计模式-建造者模式 建造者模式(Builder)是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节.建造者模式属于对象创建型模式.我们获得一个对象的时候不是直接new这个对象出来,而是对其建造者进行属性设置,然后建造者在根据设置建造出各个对象出来.建造者模式又可以称为生成器模式. 模式结构 一个标准的建造者模式包含如下角色: Builder:抽象建造者 ConcreteBuilder:具体建造者 Director

小菜学设计模式——建造者模式

背景 不要小看炒菜这件小事上,想要上一道佳肴,那是需要循规蹈矩,步步小心的.我相信你肯定在外面吃过没放盐的快餐,吃过放多了盐的快餐.....既然炒菜是一个如此复杂的过程,又必须循规蹈矩,那为什么不给他一个死规定呢?如果谁没有按照规定做事,就进行对应的提醒警告.这就是建造者模式的由来,限制规则步骤,但是开发规则细节.比如说盛菜之前必须放盐,那么规定一定要放盐,具体放多少自己论情况而定. 1.使用意图 如果你需要将一个复杂对象的构建与它的表示(构建具体过)分离,使得同样的构建过程可以创建不同的表示的

设计模式——建造者模式

HeadFirst中并没有把建造者模式(生成器模式)当做常用的设计模式来讲解,只是在附录中一带而过. 建造者模式的本质:       分离了对象组件的单独构造(由Builder来负责)和装配(由Director)来负责.从而可以构建出复杂的对象.这个模式适用于:某个对象的构建       过程复杂的情况先使用.由于实现了构建和装配的解耦.不同的构建器,相同的装配,也可以做出不同的对象相同的构建器不同的装配顺序也可以 做出不同的对象.也就是实现了构建算法.装配算法的解耦,实现了更好的复用. Dem

C#设计模式——建造者模式(Builder Pattern)

1.建造者模式简介 1.1>.定义 建造者模式(Builder)将复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示. 1.2>.使用频率  中低 1.3>.原型模式应用 在软件系统中,有时候面临一个复杂对象的创建工作,该对象通常由各个部分子对象用一定的算法构成,或者按一定的步骤组合而成:这些算法和步骤是稳定的,而构成这个对象的子对象却经常由于需求的变化而不断变化. 生活中的例子,要组装一台电脑,它的组装过程基本是不变的,都可以由主板.CPU.内存等按照某个稳定方式组合而成.

C#设计模式-建造者模式

在软件系统中,有时需要创建一个复杂对象,并且这个复杂对象由其各部分子对象通过一定的步骤组合而成. 例如一个采购系统中,如果需要采购员去采购一批电脑时,在这个实际需求中,电脑就是一个复杂的对象,它是由CPU.主板.硬盘.显卡.机箱等组装而成的,如果此时让采购员一台一台电脑去组装的话真是要累死采购员了,这里就可以采用建造者模式来解决这个问题,我们可以把电脑的各个组件的组装过程封装到一个建造者类对象里,建造者只要负责返还给客户端全部组件都建造完毕的产品对象就可以了.然而现实生活中也是如此的,如果公司要

Java设计模式——建造者模式

建造者模式(Builder Pattern)属于创建形的设计模式,使用多个简单的对象一步一步构建成一个复杂的对象. 主要解决:主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成:由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定. 何时使用:一些基本部件不会变,而其组合经常变化的时候. 应用实例: 1.去肯德基,汉堡.可乐.薯条.炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的&quo

Python设计模式——建造者模式

需求,画人物,要求画一个人的头,左手,右手,左脚,右脚和身体,画一个瘦子,一个胖子 不使用设计模式 #encoding=utf-8 __author__ = '[email protected]' if __name__=='__name__': print '画左手' print '画右手' print '画左脚' print '画右脚' print '画胖身体' print '画左手' print '画右手' print '画左脚' print '画右脚' print '画瘦身体' 这样写的

C++设计模式——建造者模式

建造者模式 在GOF的<设计模式 可复用面向对象软件的基础>中是这样说的:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 这句话,似懂非懂的.一个复杂对象的创建,其通常是由很多的子对象构成:如果一个对象能够直接就创建好了,那么也不会称之为复杂对象.由于项目中需求的变化,这个复杂对象的各个部分经常会发生剧烈的变化,但是,不管怎么变化,将它们组合在一起,组成一个复杂的对象的事实是不会变的.建造者模式就提供了一种“封装机制”来将各个对象的变化隔离开,最终,组合成复杂对象的

PHP设计模式——建造者模式

声明:本系列博客参考资料<大话设计模式>,作者程杰. 建造者模式也称生成器模式,核心思想是将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式. 例如:汽车,他的发动机引擎有好多品牌,轮胎也有各种材质,内饰更是千奇百怪:鸟,他的头.翅膀以及脚有各种颜色和形状,在创建这种复杂对象的时候,我们建议使用建造者模式. 类图: 建造者模式一般认为有四个角色: 1.产品角色,产品角色定义自身的组成属性 2.抽象建造者,抽象建造者定义了产品的创建过程以及如何