设计模式实例(Lua)笔记之四(Builder 模式)

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 = {}
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()

运行结果如下:

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-10 08:37:31

设计模式实例(Lua)笔记之四(Builder 模式)的相关文章

设计模式实例(Lua)笔记之五(Prototype 模式)

1.描述 首先从实际生活来了解原型模式的由来,假设你有一份非常好的讲义,你的朋友也想要一份,那么怎么办?重新手抄一份?显然不是,当然是用复印机复印一份来得方便.直接,并且准确性也高,这种用原型来复制而不是重新创建的思维方式就是原型模式的核心思想. Prototype Pattern也是一种创建型模式,它关注的是大量相同或相似对象的创建问题.应用原型模式就是建立一个原型,然后通过对原型来进行复制的方法,来产生一个和原型相同或相似的新对象,或者说用原型实例指定创建对象的种类,并且通过复制这些原型创建

设计模式实例(Lua)笔记之一(Factory Method工厂方法模式)

1.描述 女娲补天的故事大家都听说过吧,今天不说这个,说女娲创造人的故事,可不是"造人"的工作,这个词被现代人滥用了.这个故事是说,女娲在补了天后,下到凡间一看,哇塞,风景太优美了,天空是湛蓝的,水是清澈的,空气是清新的,太美丽了,然后就待时间长了就有点寂寞了,没有动物,这些看的到都是静态的东西呀,怎么办?别忘了是神仙呀,没有办不到的事情,于是女娲就架起了八卦炉(技术术语:建立工厂)开始创建人,具体过程是这样的:先是泥巴捏,然后放八卦炉里烤,再扔到地上成长,但是意外总是会产生的:第一次

设计模式实例(Lua)笔记之五(Bridge模式)

1.描写叙述 今天我要说说我自己,梦想中的我自己,我身价过亿,有两个大公司,一个是房地产公司,一个是服装制造业,这两个公司都非常赚钱,天天帮我在累加財富,事实上是什么公司我倒是不关心,我关心的是是不是在赚钱,赚 了多少,这才是我关心的,我是商人呀,唯利是图是我的本性,偷税漏税是我的方法,欺上瞒下.压榨员工血汗 我是的手段嘛,呵呵.同一时候我公司也 会发展,最终在有一天我认为赚钱速度太慢,于是我上下疏通,左右打关系,最终开辟了一条赚钱的康庄大道:生产山寨产品,什么产品呢?就是市场上什么牌子的东西火

设计模式实例(Lua)笔记之六(Adapter模式)

1.描写叙述 "我"在 2004 年的时候带了一个项目,做一个人力资源管理,该项目是我们总公司发起的项目,公司一共同拥有 700 多号人,包含子公司,这个项目还是比較简单的,分为三大模块:人员信息管理,薪酬管理,职位管理,当中人员管理这块就用到了适配器模式,是怎么回事呢?当时开发时明白的指明:人员信息简管理的对象是全部员工的全部信息,然后我们就这样设计了一个类图: 这个项目是 04 年年底投产的,执行到 05 年年底还是比較平稳的,中间修修补补也非常正常,05 年年底不知道是那股风吹的

设计模式实例(Lua)笔记之七(Decorator模式)

1.描写叙述 就说说"我"上小学的的糗事吧. 我上小学的时候学习成绩非常的差,班级上 40 多个同学,我基本上都是在排名 45 名以后,依照老师给我的定义就是"不是读书的料",可是我老爸管的非常严格,明知道我不是这块料,还是往赶鸭子上架,每次考试完成我都是战战兢兢的,"竹笋炒肉"是肯定少不了的,能少点就少点吧,肉可是自己的呀. 四年级期末考试考完,学校出来个非常损的招儿(这招儿如今非常流行的),打印出成绩单,要家长签字,然后才干上五年级,我那个恐

设计模式实例(Lua)笔记之三(Singleton单例模式)

1.描述: 这个模式是很有意思,而且比较简单,但是我还是要说因为它使用的是如此的广泛,如此的有人缘,单例就是单一.独苗的意思,那什么是独一份呢?你的思维是独一份,除此之外还有什么不能山寨的呢?我们举个比较难复制的对象:皇帝.    中国的历史上很少出现两个皇帝并存的时期,是有,但不多,那我们就认为皇帝是个单例模式,在这个场景中,有皇帝,有大臣,大臣是天天要上朝参见皇帝的,今天参拜的皇帝应该和昨天.前天的一样(过渡期的不考虑,别找茬哦),大臣磕完头,抬头一看,嗨,还是昨天那个皇帝,单例模式,绝对的

设计模式初学者笔记:Builder模式

[作者:byeyear    Email:[email protected]    首发:cnblogs    转载请注明] 在本文的开头,先森森的鄙视下自己……将Builder模式反反复复读了七八遍,才敢说自己对其有了初步的了解.这比花在Abstract Factory上的时间长多了.如果GoF将Builder模式放在第一个讲,估计我就会把这本书归结成天书直接扔一边了. Builder模式的关键在于,将“要做什么”与“做出来”分离,将“如何装配”与“完成装配”分离: Director知道“要做

《Head First 设计模式》学习笔记——适配器模式 + 外观模式

在ADO.NET中,对于我们从数据库中取出的数据都要放到一个DataSet中,不管你是Access的数据库,还是SQL的数据库,或者是Oracle的数据库都要放到DataSet中..NET中并没有提供如:SqlDataSet.OleDbDataSet.OracleDataSet等,它只提供了一种DataSet就是用SqlDataAdapte等去填充数据:为什么这一个DataSet能存放不同的数据呢?就是有这些适配器来适配.----题记 设计模式 适配器模式:将一个类的接口,转换成客户期待的另一个

易学设计模式看书笔记(7) - 代理模式

代理模式 1.系统日志记录的例子:给系统中的业务逻辑加上日志 (1):最简单直接的做法 public class Test { private Logger logger = Loger.getLogger(this.getClass().getName()); public void doLgic(String name){ logger.log(name + "开始业务逻辑处理..."); //业务逻辑处理相关程序 System.out.println("业务逻辑处理相关