博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式实例(Lua)笔记之四(Builder 模式)
阅读量:6338 次
发布时间:2019-06-22

本文共 4701 字,大约阅读时间需要 15 分钟。

1.描写叙述:

     又是一个周三,快要下班了,老大突然又拉住我,喜滋滋的告诉我“牛叉公司非常惬意我们做的模型,又签订了一个合同,把奔驰、宝马的车辆模型都交给我我们公司制作了,只是这次又额外添加了一个新需求:汽车的启动、停止、喇叭声音、引擎声音都有客户自己控制,他想什么顺序就什么顺序,这个没问题吧?”。

    看着老大殷切的目光,我还能说啥,肯定的点头,“没问题!”,加班加点做呗,“再苦再累就当自己二百五 再难再险就当自己二皮脸 与君共勉!”这句话说出了我的心声。

那任务是接下来,我们怎么做实现呢?首先我们想了,奔驰、宝马都是一个产品,他们有共同拥有的属性,牛叉公司关心的是单个模型,奔驰模型 A 是先有引擎声音,然后再启动;奔驰模型 B 呢是先启动起来,然后再有引擎声音,这才是牛叉公司要关关心的,那到我们老大这边呢,就是满足人家的要求,要什么顺序就立刻能产生什么顺序的模型出来,我呢就负责把老大的要求实现掉,并且还要是批量的,看不懂?没关系,继续看下去,首先由我生产出 N多个奔驰和宝马车辆模型,这些车辆模型的都有 run 方法,可是详细到每个模型的 run 方法可能中间的执行任务的顺序是不同的,老大说要啥顺序,我就给啥顺序,终于客户买走后仅仅能是既定的模型。先看类图: 

凝视:
    main()。客户
    CCarModel。产品模型
    CBenzModel。奔驰模型
    CBMWModel,宝马模型
    ICarBuilder。建造者接口
    CBenzBuilder,奔驰建造者
    CBMWBuilder,宝马建造者
    CDirector,导演
说明:CCarModel实现模板方法。Builder负责開始建造产品。建造产品时,构建的顺序由Director或main决定。
注意:建造者模式和抽象工厂非常相似。建造者更重视产品建造时的逻辑顺序。而抽象工厂更重视生产出不同型号的产品,抽象工厂不关心顺序。

2.代码:

require "class"-------- CarModel --------CarModel = class()function CarModel:ctor()	self.m_pSequence = {}endfunction CarModel:Start()	print("CarModel Start")endfunction CarModel:Stop()	print("CarModel Stop")endfunction CarModel:Alarm()	print("CarModel Alarm")endfunction CarModel:EngineBoom()	print("CarModel EngineBoom")endfunction CarModel:SetSequence(pSeq)	self.m_pSequence = pSeqendfunction 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	endend-------- BenzModel --------BenzModel = class(CarModel)function BenzModel:Start()	print("奔驰发动...")endfunction BenzModel:Stop()	print("奔驰停车...")endfunction BenzModel:Alarm()	print("奔驰鸣笛")endfunction BenzModel:EngineBoom()	print("奔驰引擎声音是这样....")end-------- BMWModel --------BMWModel = class(CarModel)function BMWModel:Start()	print("宝马发动...")endfunction BMWModel:Stop()	print("宝马停车...")endfunction BMWModel:Alarm()	print("宝马鸣笛")endfunction BMWModel:EngineBoom()	print("宝马引擎声音是这样....")end------------------------------------- ICarBuilder -------------------------------------ICarBuilder = class()function ICarBuilder:SetSequence(pseq)endfunction ICarBuilder:GetCarModel()end-------- BenzBuilder --------BenzBuilder = class(ICarBuilder)function BenzBuilder:ctor()	self.m_pBenz = BenzModel.new()endfunction BenzBuilder:clear()	print("BenzBuilder:clear")	self.m_pBenz = nilendfunction BenzBuilder:SetSequence(pSeq)	self.m_pBenz:SetSequence(pSeq)endfunction BenzBuilder:GetCarModel()	return self.m_pBenzend-------- BMWBuilder --------BMWBuilder = class(ICarBuilder)function BMWBuilder:ctor()	--print("BenzBuilder:ctor")	self.m_pBMW = BMWModel.new()endfunction BMWBuilder:clear()	self.m_pBMW = nilendfunction BMWBuilder:SetSequence(pSeq)	self.m_pBMW:SetSequence(pSeq)endfunction BMWBuilder:GetCarModel()	return self.m_pBMWend--[[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()endfunction Director:clear()	self.m_pSeqence 	= {}	self.m_pBenzBuilder = nil	self.m_pBMWBuilder 	= nilend-- 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()endmain()

执行结果例如以下:

    

你可能感兴趣的文章
HDU 1255 覆盖的面积(矩形面积交)
查看>>
SQL数据库无法附加,提示 MDF" 已压缩,但未驻留在只读数据库或文件组中。必须将此文件解压缩。...
查看>>
第二十一章流 3用cin输入
查看>>
在workflow中,无法为实例 ID“...”传递接口类型“...”上的事件“...” 问题的解决方法。...
查看>>
获取SQL数据库中的数据库名、所有表名、所有字段名、列描述
查看>>
Orchard 视频资料
查看>>
简述:预处理、编译、汇编、链接
查看>>
调试网页PAIP HTML的调试与分析工具
查看>>
路径工程OpenCV依赖文件路径自动添加方法
查看>>
玩转SSRS第七篇---报表订阅
查看>>
WinCE API
查看>>
SQL语言基础
查看>>
对事件处理的错误使用
查看>>
最大熵模型(二)朗格朗日函数
查看>>
html img Src base64 图片显示
查看>>
[Spring学习笔记 7 ] Spring中的数据库支持 RowMapper,JdbcDaoSupport 和 事务处理Transaction...
查看>>
FFMPEG中关于ts流的时长估计的实现(转)
查看>>
Java第三次作业
查看>>
【HDOJ 3652】B-number
查看>>
android代码混淆笔记
查看>>