您的位置:首页 >电脑游戏 >

每日报道:建造者模式Builder实例PHP代码分析解读,PHP设计模式(三)建造者模式Builder实例详解【创建型】

2022-11-17 20:02:43    来源:元马网

建造者模式Builder实例PHP代码分析解读,PHP设计模式(三)建造者模式Builder实例详解【创建型】,计算工资:工资的计算一般是:底薪+奖金-税。但底薪分为一级8000、二级6000、三级4000三个等级。根据岗位不同奖金的发放也不一样,管理及日常事务处理岗位(A类)每月根据领导及同事间的评议得分计算奖金,销售岗位(B类)则根据销售额发放提成。税金则根据奖金和底薪的数额进行计算。由此看出该工资的计算方式是比较稳定的构建算法,但对工资的每一部分都会根据不同的情况产生不同的算法,如何将客户端与变化巨烈的底薪、奖金和税金计算方式分离呢,这也比较适合用建造者模式。当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。本文实例讲述了PHP设计模式:建造者模式Builder。分享给大家供大家参考,具体如下:


(资料图片)

1. 概述

在软件开发的过程中,当遇到一个“复杂的对象”的创建工作,该对象由一定各个部分的子对象用一定的算法构成,由于需求的变化,复杂对象的各个部分经常面临剧烈的变化,但将它们组合在一起的算法相对稳定。

例子1:买肯德基

典型的儿童餐包括一个主食,一个辅食,一杯饮料和一个玩具(例如汉堡、炸鸡、可乐和玩具车)。这些在不同的儿童餐中可以是不同的,但是组合成儿童餐的过程是相同的。

客户端:顾客,想去买一套套餐(这里面包括汉堡,可乐,薯条),可以有1号和2号两种套餐供顾客选择。指导者角色:收银员。知道顾客想要买什么样的套餐,并告诉餐馆员工去准备套餐。建造者角色:餐馆员工。按照收银员的要求去准备具体的套餐,分别放入汉堡,可乐,薯条等。产品角色:最后的套餐,所有的东西放在同一个盘子里面。

例子2:计算工资:工资的计算一般是:底薪+奖金-税。但底薪分为一级8000、二级6000、三级4000三个等级。根据岗位不同奖金的发放也不一样,管理及日常事务处理岗位(A类)每月根据领导及同事间的评议得分计算奖金,销售岗位(B类)则根据销售额发放提成。税金则根据奖金和底薪的数额进行计算。由此看出该工资的计算方式是比较稳定的构建算法,但对工资的每一部分都会根据不同的情况产生不同的算法,如何将客户端与变化巨烈的底薪、奖金和税金计算方式分离呢,这也比较适合用建造者模式。

2 . 问题

我们如何应对这种变化,如何提供一种“封装机制”来隔离“复杂对象的各个部”的变化,从而保持系统中的“稳定构建算法”而不随需求的变化而变化?

3. 解决方案

建造者模式: 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

4. 适用性

在以下情况使用Builder模式

•当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。

•当构造过程必须允许被构造的对象有不同的表示时。

5. 结 构

此模式结构如下页上图所示。

6. 构建模式的组成

• 抽象建造者角色(Builder):为创建一个Product对象的各个部件指定抽象接口,以规范产品对象的各个组成成分的建造。一般而言,此角色规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建。

• 具体建造者(ConcreteBuilder)

1)实现Builder的接口以构造和装配该产品的各个部件。即实现抽象建造者角色Builder的方法。

2)定义并明确它所创建的表示,即针对不同的商业逻辑,具体化复杂对象的各部分的创建

3) 提供一个检索产品的接口

4) 构造一个使用Builder接口的对象即在指导者的调用下创建产品实例

指导者(Director):调用具体建造者角色以创建产品对象的各个部分。指导者并没有涉及具体产品类的信息,真正拥有具体产品的信息是具体建造者对象。它只负责保证对象各部分完整创建或按某种顺序创建。

产品角色(Product):建造中的复杂对象。它要包含那些定义组件的类,包括将这些组件装配成产品的接口。

7. 效果

Builder模式的主要效果:

1 ) 它使你可以改变一个产品的内部表示 Builder对象提供给导向器一个构造产品的抽象接口。该接口使得生成器可以隐藏这个产品的表示和内部结构。它同时也隐藏了该产品是如何装配的。因为产品是通过抽象接口构造的,你在改变该产品的内部表示时所要做的只是定义一个新的生成器。

2) 它将构造代码和表示代码分开 Builder模式通过封装一个复杂对象的创建和表示方式提高了对象的模块性。客户不需要知道定义产品内部结构的类的所有信息;这些类是不出现在Builder接口中的。每个Concrete Builder包含了创建和装配一个特定产品的所有代码。这些代码只需要写一次;然后不同的Director可以复用它以在相同部件集合的基础上构作不同的Product。

3 ) 它使你可对构造过程进行更精细的控制 Builder模式与一下子就生成产品的创建型模式不同,它是在导向者的控制下一步一步构造产品的。仅当该产品完成时导向者才从生成器中取回它。因此Builder接口相比其他创建型模式能更好的反映产品的构造过程。这使你可以更精细的控制构建过程,从而能更精细的控制所得产品的内部结构。

8. 实现:

指导者:收银员

buildPart1();  $builder->buildPart2(); } }

抽象建造者:

/** * 抽象建造者 * */ abstract class Builder { /**  * 创建产品的第一部分   */ public abstract function buildPart1();  /**  *   * 创建产品的第二部分   */ public abstract function buildPart2();  /**  *   * 返回产品   */ public abstract function getProduct(); }

具体建造者类:

/** * 具体建造者类:餐馆员工,返回的套餐是:汉堡两个+饮料一个 * */ class ConcreteBuilder1 extends Builder { protected $_product = null;//产品对象 function __construct(){  $this->_product = new Product(); }  /**  * 创建产品的第一部分::汉堡=2   */ public function buildPart1() {  $this->_product->add("Hamburger",2); } /**  *   * 创建产品的第二部分:   */ public function buildPart2() {  $this->_product->add("Drink", 1); } /**  * 返回产品对象 :  *   */ public function getProduct() {  return $this->_product; } }/** * 具体建造者类:餐馆员工,汉堡1个+饮料2个 * */ class ConcreteBuilder2 extends Builder { protected $_product = null;//产品对象 function __construct(){  $this->_product = new Product(); }  /**  * 创建产品的第一部分:汉堡   */ public function buildPart1() {  $this->_product->add("Hamburger", 1); } /**  *   * 创建产品的第二部分:drink=2   */ public function buildPart2() {  $this->_product->add("Drink", 2); } /**  * 返回产品对象 :  *   */ public function getProduct() {  return $this->_product; } }

产品类:

/** * 产品类 */ class Product { public $products = array(); /**  * 添加具体产品  */ public function add($name, $value) {  $this->products[$name] = $value; } /**  * 给顾客查看产品  */ public function showToClient() {  foreach ($this->products as $key => $v) {  echo $key , "=" , $v ,"
"; } } }

客户程序:

//客户程序 class Client { /**  * 顾客购买套餐  *  */ public function buy($type) {  //指导者,收银员  $director = new DirectorCashier();   //餐馆员工,收银员     $class = new ReflectionClass("ConcreteBuilder" .$type );     $concreteBuilder = $class->newInstanceArgs();     //收银员组合员工返回的食物     $director->buildFood($concreteBuilder);     //返回给顾客     $concreteBuilder->getProduct()->showToClient(); } } //测试 ini_set("display_errors", "On"); $c = new Client(); $c->buy(1);//购买套餐1 $c->buy(2);//购买套餐1

9. 建造者模式的优点

首先,建造者模式的封装性很好。使用建造者模式可以有效的封装变化,在使用建造者模式的场景中,一般产品类和建造者类是比较稳定的,因此,将主要的业务逻辑封装在导演类中对整体而言可以取得比较好的稳定性。

其次,建造者模式很容易进行扩展。如果有新的需求,通过实现一个新的建造者类就可以完成,基本上不用修改之前已经测试通过的代码,因此也就不会对原有功能引入风险。

10. 建造者模式与工厂模式的区别

我们可以看到,建造者模式与工厂模式是极为相似的,总体上,建造者模式仅仅只比工厂模式多了一个“导演类”的角色。在建造者模式的类图中,假如把这个导演类看做是最终调用的客户端,那么图中剩余的部分就可以看作是一个简单的工厂模式了。

与工厂模式相比,建造者模式一般用来创建更为复杂的对象,因为对象的创建过程更为复杂,因此将对象的创建过程独立出来组成一个新的类——导演类。也就是说,工厂模式是将对象的全部创建过程封装在工厂类中,由工厂类向客户端提供最终的产品;而建造者模式中,建造者类一般只提供产品类中各个组件的建造,而将具体建造过程交付给导演类。由导演类负责将各个组件按照特定的规则组建为产品,然后将组建好的产品交付给客户端。

11. 总结

建造者模式与工厂模式类似,他们都是建造者模式,适用的场景也很相似。一般来说,如果产品的建造很复杂,那么请用工厂模式;如果产品的建造更复杂,那么请用建造者模式。

更多关于PHP相关内容感兴趣的读者可查看本站专题:《php面向对象程序设计入门教程》、《PHP数组(Array)操作技巧大全》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

希望本文所述对大家PHP程序设计有所帮助。建造者模式Builder实例PHP代码分析解读,PHP设计模式(三)建造者模式Builder实例详解【创建型】相关文章内容介绍。

相关阅读

环球头条:煎饼侠的投资是多少,卖煎饼需要投资多少钱

【世界新视野】上网卡怎么办理,移动物联卡怎么申请

全球热文:重庆黔江天天快递地址,黔江天天快递在哪里发

当前速看:长城h5加什么柴油(长城h5柴油用什么机油)

世界播报:电脑游戏中心下载安装 游戏王大师决斗下载

哈佛汽车h6如何,哈弗H6到底咋样

全球时讯:广东房价哪个城市最好,广东房价

尼康 300mm f 4e 镜头怎么样,尼康定焦300镜头好吗

环球快看:鹰潭附近有什么高铁站点,鹰潭高铁站

世界简讯:投诉税局会怎么样,税务专管员投诉有用吗

速看:税务数据怎么查询,查询上个月的纳税申报数据怎样查

焦点观察:重庆房价哪个县最好的,重庆哪里的房价最便宜

怎么查看幼儿园远程监控,幼儿园有远程监控在家怎么看不了

高铁为什么不停靠珠海北站,珠海高铁站在哪里

台州房价最低是哪个区的,台州里面那里房价最低

每日动态!北京怎么查询公司税务状态,北京车牌摇号怎样查询

全球球精选!《模拟山羊3》IGN评8分 更沙雕充满许多乐趣!

每日热闻!《使命召唤:战区2》Steam玩家数突破40万 太火爆了

快资讯:灵魂石幸存者前期选什么buff好

万代南梦宫:《铁拳8》或将在2023财年推出

环球快看点丨《卧龙:苍天陨落》吕布人设图公布

环球要闻:《魔兽世界》公布“巨龙时代”雷霆骤起前夕事件 本周上线

全球观焦点:《灵魂骇客2》发布1.02版本更新 新增冲刺和加速战斗

《漫威复仇者联盟》宣布“冬兵”将于11月29日更新上线

热资讯!《战锤40K:暗潮》配置要求公布 11月30日发售

动态焦点:《cod战区2》配枪思路攻略

《cod战区2》武器搭配推荐攻略

世界快资讯:跃彩璃音《幻塔》新版本今日开启

【环球快播报】《cod战区2》进不去游戏解决方法攻略

环球快消息!德国大力发展游戏产业 行业基金增加至7300万美元

《cod战区2》解锁M13BDMZ流程攻略

《刺客信条:幻景》新概念图公布 育碧波尔多5周年纪念

全球看点:u809(u8093)

香港服务器做游戏服务端需要注意哪些问题

全球要闻:乡镇超市一年挣多少,干小超市一年挣多少钱

3万以下免税个体如何开机打票,价外费用如何开票

《街头霸王6》发布红衣战士肯游戏截图

【当前独家】开源编程语言TypeScript命名空间的规则介绍,TypeScript命名空间合并讲解

焦点观察:《星空》《红霞岛》跳票Xbox老大不惊讶:这是正确决定

环球播报:N卡新驱动发布 优化《漫威蜘蛛侠:迈尔斯》

全球最新:《模拟山羊3》16分钟试玩视频 含致敬《PT》彩蛋

天天讯息:真人互动多结局游戏《岛潮酒店》明年全平台发售

苹果手机关闭哪些功能省电

看点:微鲸vr,看微鲸如何打破VR混沌之局

世界新动态:计算机文献网站有哪些类型,可以检索文献的网站有哪些

环球时讯:iphone开场铃声下载(下载苹果开场铃声)

vivo手机型号对照表(vivo手机全部型号对照表)

弹幕射击游戏《擦弹反击GM》将于明年1/18推出

天天观速讯丨黑曜石表示没Game Pass就没《Pentiment》

《前线任务:重制版》实机预告片第二弹公布

游戏《海绵宝宝:宇宙摇摆》获原版动画配音支持

2D像素复古动作游戏《原初之光》11月发售主机版

索爱lt18i说明书(索爱手机lt18i)

全球即时:孝感市税收收入多少,湖北孝感市孝南区

【独家焦点】摩托罗拉338c,掌中宝338C经典怀旧手机

三星note3刷flyme系统,N9006zcugoh2 root

4㎡的小阳台太鸡肋,小阳台能改什么

资讯:《火焰纹章:结合》剧情预告 明年1月20日发售

动态焦点:《怪物猎人崛起:曙光》免费更新第3弹11月24日上线

全球即时看!HTCG10怎么打不开word文档

天天热议:iphone绿色壁纸[整理版] 苹果专用绿色壁纸

环球热文:福建国税局举报邮箱是多少,厦多所中小学公布举报电话

今日热门!什么是小程序代运营?哪家好?

聚焦:一千元内音质最好的音响,1000元以下音响排行榜

焦点热讯:今天是V社游戏《半条命2》发售18周年

当前快讯:手机导航软件哪个是最好最准确的?

聚焦:BootLoader和fastboot是 什么意思

正在播放公公与两儿媳在线现看HD 公公与媳妇快艇

快消息!nod,Jackson

11设备升级公告 三星11

《光明记忆:无限》即将推出第三人称视角

《木卫四协议》过场动画获得索尼工作室Visual Arts的帮助

天天看点:《护林员模拟器》宣传片公开 登陆Steam抢先体验

当前速读:汽车上焊东西注意什么(汽车年检注意哪些东西)

全球热文:安能物流网点江夏纸坊地址,江夏纸坊物流在哪里

天猫下拉领券哪里领,618购物节那么多优惠都得去哪领

风暴英雄如何获得钻石,《风暴英雄》官方网站

全球看点:尼康d5300说明书电子版,15张普通人拍出来的好照片

apple id是什么意思啊?

世界要闻:std是什么意思,整合规划是什么意思

苹果最贵的手机多少钱(世界上最贵的苹果手机多少钱)

剃须刀哪个牌子好,刮胡刀哪个牌子好

看电视看直播方法,海信凯夫k1怎么root

CDPR宣布:《巫师3》次世代版本更新将追加中文配音

使命召唤战争地带2有什么特色内容

腾讯发布第三季度财报 营收1401亿元

动态焦点:吸血鬼幸存者狼人怎么解锁比较好

《战神:诸神黄昏》玩家吐槽:谜题全被NPC解完了

《逆水寒》手游光追实机演示发布 向端游全面对齐

宝可梦朱紫朱版本飞天螳螂在哪里抓

战神5最强武器怎么获得?战神5最强武器有什么效果?

【环球速看料】宝可梦朱紫朱版本榛果球在哪里抓

全球观天下!吸血鬼幸存者秘法牌苏醒有什么用

每日时讯!《多多自走棋》Steam页面上线 国区独占

环球快资讯:《猩红沙漠》延期至23年发售《多可比》被迫延期

每日焦点!《英雄联盟》公布莫德凯撒“灰烬骑士”系列皮肤演示视频

吸血鬼幸存者树哥怎么解锁比较好

天天信息:战神诸神黄昏是不是长矛比斧子双刀强很多

《堡垒之夜》联动《火箭联盟》 联动宣传片公布

战神诸神黄昏斯瓦塔尔法海姆这个双boss怎么打

今日报丨《漫威暗夜之子》公布第三部前传动画短片 地狱之轮

天天通讯!VR游戏《地平线:山之呼唤》发布预购预告片 登录PS VR2

人民网:游戏已摆脱娱乐产品的单一属性

全球短讯!天猫双十二攻略出炉,双十二天猫魔盒怎么领取

每日头条!2022年济南市重点项目名单出炉,济南后龙小学怎么样

每日聚焦:包头离南昌多少公里,薛家湾离包头多少公里

《阴阳师》觅四时活动攻略

阿里宝卡月租19不是梦 天神卡19元申请入口