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="" />

最新文章

  1. mysql 查看数据库、表的基本命令
  2. 使用ab进行压力测试
  3. java线层的启动与停止
  4. libjingle开发人员指南
  5. 【转载】CocoaPods安装和使用教程
  6. 获取和设置iframe中的元素
  7. Learning Lua Programming (4) Cocos2d-x中Lua编程(一)
  8. c#程序连接mysql,报"Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8_unicode_ci,IMPLICIT) for operation '='"的解决方案
  9. 在360、UC等浏览器,img不加载原因
  10. ansible Templates
  11. LeetCode数组解题模板
  12. springcloud相关资料收集
  13. 开发框架DevExtreme发布v18.2.4|附下载
  14. linux之 修改磁盘调度算法
  15. 这里给大家介绍一下通过 Wi-Fi 连接“慷慨捐赠”你的身份信息的七种方法.
  16. C/C++ -- Gui编程 -- Qt库的使用 -- 组件大杂烩
  17. atcoder ARC092 D - Two Sequences 二分 & 二进制
  18. Apache + WordPress + SSL 完全指南
  19. JQ自定义下拉列表插件
  20. S16课件

热门文章

  1. Domato学习
  2. Python编程举例-iter和next结合定制可迭代对象
  3. Linux下定时备份MySQL数据库的Shell脚本
  4. Servlet技术——常用的类和接口
  5. 记录一下最近犯得sb的翻车错误
  6. export导出.xls时,在火狐的情况下出现表名乱码的情况的解决方案
  7. XSS漏洞自动化攻击工具XSSer
  8. ubuntu 安装qq 及解决安装完搜狗输入法不显示键盘的方法
  9. 又见Python<1>:使用Anaconda搭建Python开发环境(Windows7)
  10. 2018 计算之道初赛第二场 阿里巴巴的手机代理商(困难)(反向可持久化Trie)