设计模式实例(Lua)笔记之四(Builder 模式)
1.描写叙述:
又是一个周三,快要下班了,老大突然又拉住我,喜滋滋的告诉我“牛叉公司非常惬意我们做的模型,又签订了一个合同,把奔驰、宝马的车辆模型都交给我我们公司制作了,只是这次又额外添加了一个新需求:汽车的启动、停止、喇叭声音、引擎声音都有客户自己控制,他想什么顺序就什么顺序,这个没问题吧?”。
看着老大殷切的目光,我还能说啥,肯定的点头,“没问题!”,加班加点做呗,“再苦再累就当自己二百五 再难再险就当自己二皮脸 与君共勉!”这句话说出了我的心声。
那任务是接下来,我们怎么做实现呢?首先我们想了,奔驰、宝马都是一个产品,他们有共同拥有的属性,牛叉公司关心的是单个模型,奔驰模型 A 是先有引擎声音,然后再启动;奔驰模型 B 呢是先启动起来,然后再有引擎声音,这才是牛叉公司要关关心的,那到我们老大这边呢,就是满足人家的要求,要什么顺序就立刻能产生什么顺序的模型出来,我呢就负责把老大的要求实现掉,并且还要是批量的,看不懂?没关系,继续看下去,首先由我生产出 N多个奔驰和宝马车辆模型,这些车辆模型的都有 run 方法,可是详细到每个模型的 run 方法可能中间的执行任务的顺序是不同的,老大说要啥顺序,我就给啥顺序,终于客户买走后仅仅能是既定的模型。先看类图:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcmV4dWVmZW5neWU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" style="border:none;" />
凝视:
main()。客户
CCarModel。产品模型
CBenzModel。奔驰模型
CBMWModel,宝马模型
ICarBuilder。建造者接口
CBenzBuilder,奔驰建造者
CBMWBuilder,宝马建造者
CDirector,导演
说明:CCarModel实现模板方法。Builder负责開始建造产品。建造产品时,构建的顺序由Director或main决定。
注意:建造者模式和抽象工厂非常相似。建造者更重视产品建造时的逻辑顺序。而抽象工厂更重视生产出不同型号的产品,抽象工厂不关心顺序。
2.代码:
require "class"
-------- CarModel --------
CarModel = class()
function CarModel:ctor()
self.m_pSequence = {}
end function CarModel:Start()
print("CarModel Start")
end function CarModel:Stop()
print("CarModel Stop")
end function CarModel:Alarm()
print("CarModel Alarm")
end function CarModel:EngineBoom()
print("CarModel EngineBoom")
end function CarModel:SetSequence(pSeq)
self.m_pSequence = pSeq
end function CarModel:Run()
if self.m_pSequence then
for _,v in pairs(self.m_pSequence) do
if v == "start" then
self:Start()
elseif v == "stop" then
self:Stop()
elseif v == "alarm" then
self:Alarm()
elseif v == "engineBoom" then
self:EngineBoom()
end
end
end
end -------- BenzModel --------
BenzModel = class(CarModel) function BenzModel:Start()
print("奔驰发动...")
end function BenzModel:Stop()
print("奔驰停车...")
end function BenzModel:Alarm()
print("奔驰鸣笛")
end function BenzModel:EngineBoom()
print("奔驰引擎声音是这样....")
end -------- BMWModel --------
BMWModel = class(CarModel) function BMWModel:Start()
print("宝马发动...")
end function BMWModel:Stop()
print("宝马停车...")
end function BMWModel:Alarm()
print("宝马鸣笛")
end function BMWModel:EngineBoom()
print("宝马引擎声音是这样....")
end -----------------------------
-------- ICarBuilder --------
-----------------------------
ICarBuilder = class() function ICarBuilder:SetSequence(pseq) end function ICarBuilder:GetCarModel() end -------- BenzBuilder --------
BenzBuilder = class(ICarBuilder) function BenzBuilder:ctor()
self.m_pBenz = BenzModel.new()
end function BenzBuilder:clear()
print("BenzBuilder:clear")
self.m_pBenz = nil
end function BenzBuilder:SetSequence(pSeq)
self.m_pBenz:SetSequence(pSeq)
end function BenzBuilder:GetCarModel()
return self.m_pBenz
end -------- BMWBuilder --------
BMWBuilder = class(ICarBuilder) function BMWBuilder:ctor()
--print("BenzBuilder:ctor")
self.m_pBMW = BMWModel.new()
end function BMWBuilder:clear()
self.m_pBMW = nil
end function BMWBuilder:SetSequence(pSeq)
self.m_pBMW:SetSequence(pSeq)
end function BMWBuilder:GetCarModel()
return self.m_pBMW
end --[[
A 型号的奔驰车辆模型是仅仅有启动(start)、停止(stop)方法,其它的引擎声音、喇叭都没有;
B 型号的奔驰车是先发动引擎(engine boom),然后启动(star),再然后停车(stop),没有喇叭;
C 型号的宝马车是先喇叭叫一下(alarm),然后(start),再然后是停车(stop),引擎不轰鸣;
D 型号的宝马车就一个启动(start),然后一路跑到黑,永动机,没有停止方法,没有喇叭,没有引擎轰鸣;E 型号、F 型号...等等,能够有非常多,启动(start)、停止(stop)、喇叭(alarm)、引擎轰鸣(engine boom)
]]
--------------------------
-------- Director --------
--------------------------
Director = class() function Director:ctor()
self.m_pSeqence = {}
self.m_pBenzBuilder = BenzBuilder.new()
self.m_pBMWBuilder = BMWBuilder.new()
end function Director:clear()
self.m_pSeqence = {}
self.m_pBenzBuilder = nil
self.m_pBMWBuilder = nil
end -- A 型号的奔驰车
function Director:GetABenzModel()
print("--------A 型号的奔驰车--------") self.m_pSeqence = {} table.insert(self.m_pSeqence, "start")
table.insert(self.m_pSeqence, "stop") self.m_pBenzBuilder:SetSequence(self.m_pSeqence) return self.m_pBenzBuilder:GetCarModel()
end -- B 型号的奔驰车
function Director:GetBBenzModel()
print("--------B 型号的奔驰车--------") self.m_pSeqence = {} table.insert(self.m_pSeqence, "engineBoom")
table.insert(self.m_pSeqence, "start")
table.insert(self.m_pSeqence, "stop") self.m_pBenzBuilder:SetSequence(self.m_pSeqence) return self.m_pBenzBuilder:GetCarModel()
end -- C 型号的宝马车
function Director:GetCBMWModel()
print("--------C 型号的宝马车--------") self.m_pSeqence = {} table.insert(self.m_pSeqence, "alarm")
table.insert(self.m_pSeqence, "start")
table.insert(self.m_pSeqence, "stop")
self.m_pBMWBuilder:SetSequence(self.m_pSeqence) return self.m_pBMWBuilder:GetCarModel()
end -- D 型号的宝马车
function Director:GetDBMWModel()
print("--------D 型号的宝马车--------") self.m_pSeqence = {} table.insert(self.m_pSeqence, "start")
self.m_pBMWBuilder:SetSequence(self.m_pSeqence) return self.m_pBMWBuilder:GetCarModel()
end --- main ---
function main()
director = Director.new()
director:GetABenzModel():Run()
director:GetBBenzModel():Run()
director:GetCBMWModel():Run()
director:GetDBMWModel():Run()
end main()
执行结果例如以下:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
设计模式实例(Lua)笔记之四(Builder 模式)的更多相关文章
- 《图解设计模式》读书笔记3-3 Builder模式
目录 示例程序 类图 代码 角色 思路拓展 谁知道什么 构造和实现分离 和Template Method模式的区别和联系? Builder模式即建造者模式,利用这个模式可以组装具有复杂结构的实例. 示 ...
- 设计模式实例(Lua)笔记之五(Bridge模式)
1.描写叙述 今天我要说说我自己,梦想中的我自己,我身价过亿,有两个大公司,一个是房地产公司,一个是服装制造业,这两个公司都非常赚钱,天天帮我在累加財富,事实上是什么公司我倒是不关心,我关心的是是不是 ...
- 设计模式实例(Lua)笔记之七(Decorator模式)
1.描写叙述 就说说"我"上小学的的糗事吧. 我上小学的时候学习成绩非常的差,班级上 40 多个同学,我基本上都是在排名 45 名以后,依照老师给我的定义就是"不是读书的 ...
- 设计模式实例(Lua)笔记之六(Adapter模式)
1.描写叙述 "我"在 2004 年的时候带了一个项目,做一个人力资源管理,该项目是我们总公司发起的项目,公司一共同拥有 700 多号人,包含子公司,这个项目还是比較简单的,分为三 ...
- 设计模式初学者笔记:Builder模式
[作者:byeyear Email:byeyear@hotmail.com 首发:cnblogs 转载请注明] 在本文的开头,先森森的鄙视下自己……将Builder模式反反复复读了七 ...
- Android设计模式源码解析之Builder模式
https://github.com/simple-android-framework/android_design_patterns_analysis/tree/master/builder/mr. ...
- 设计模式C++描述----07.建造者(Builder)模式
一. 概述 Builder 模式要解决的问题是:当我们要创建的对象很复杂的时候(通常是由很多其他的对象组合而成),我们要要复杂对象的创建过程和这个对象的表示(展示)分离开 来,这样做的好处就是通过一步 ...
- 设计模式C++学习笔记之四(Multition多例模式)
多例模式,这个在GOF的模式设计里没有提到,但在实际工作中确实会用到.更详细的内容及说明可以参考原作者博客:cbf4life.cnblogs.com. 4.1.解释 main(),客户 略 说明: ...
- 《图解设计模式》读书笔记9-2 Proxy模式
目录 Proxy模式 示例程序 程序描述 类图 程序 角色和类图 角色 模式类图 思路拓展 提升速度 代理与委托 Http代理 与其他模式的关联 Decorator模式 Proxy模式 Proxy是代 ...
随机推荐
- 长沙理工大学第十二届ACM大赛-重现赛 K - 大家一起来数二叉树吧
题目描述 某一天,Zzq正在上数据结构课.老师在讲台上面讲着二叉树,zzq在下面发着呆. 突然zzq想到一个问题:对于一个n个节点,m个叶子的二叉树,有多少种形态呐?你能告诉他吗? 对于第一组样例的解 ...
- sublime 字体设置
安装完成sublime之后,推荐一种比较舒服的字体设置,个人习惯.配置步骤如下,打开sublime-->Preferences-->Settings - User 2.复制以下内容粘贴,并 ...
- Highcharts实现走势图
Highcharts 是一个用纯JavaScript编写的一个图表库, 能够很简单便捷的在web网站或是web应用程序添加有交互性的图表,并且免费提供给个人学习.个人网站和非商业用途使用.HighCh ...
- BZOJ4554 HEOI2016游戏
网络流. 我一开始傻傻的将每条边与每一列连边,边权为联通块树,但是这样做是错的因为我们就在跑网络流中会忽略掉边和列的关系. 我们在做网络流题时一定要注意题目中给出的限制条件,一定要以限制条件建图!!! ...
- CodeForces 1063C. Dwarves, Hats and Extrasensory Abilities 交互
题目大意: 依次给定$n$个点的颜色,要求给定这$n$个点的坐标以及一条可以把他们分成两部分的直线 强制在线(交互) $n \leqslant 30$ 感觉自己真像一个乱搞... 我们只考虑把点放在最 ...
- 对Java Serializable(序列化)的理解和总结(二)
遇到这个 Java Serializable 序列化这个接口,我们可能会有如下的问题a,什么叫序列化和反序列化 b,作用.为啥要实现这个 Serializable 接口,也就是为啥要序列化 c,ser ...
- python爬虫我是斗图之王
python爬虫我是斗图之王 本文会以斗图啦网站为例,爬取所有表情包. 阅读之前需要对线程池.连接池.正则表达式稍作了解. 分析网站 页面url分析 打开斗图啦网站,简单翻阅之后发现最新表情每页包含的 ...
- CSS的flex布局(转载)
我们之前已经学过一些布局模型,比如说浮动,绝对定位等等,但是这些布局方式一是不够简洁,而是使用的范围确实是太窄了. flex模型拥有比较多的属性,来设置多样的布局方式,接下来我们就详细介绍各种属性对布 ...
- MySQL主库切换那些事
最近连续经历了机架掉电和交换机挂掉,着实切了不少主库,虽然过程心惊胆跳,但是也算是上过战场,经过了实战演习,相信TEAM中的小伙伴们对于切主库已经可以驾轻就熟了. MySQL的主库切换也属于DBA的一 ...
- LINUX 高可用群集之 ~Corosync~
Corosync:它属于OpenAIS(开放式应用接口规范)中的一个项目corosync一版本中本身不具 备投票功能,到了corosync 2.0之后引入了votequorum子系统也具备了投票功能了 ...