1.描寫叙述:
又是一個周三,快要下班了,老大突然又拉住我,喜滋滋的告訴我“牛叉公司非常惬意我們做的模型,又簽訂了一個合同,把奔馳、寶馬的車輛模型都交給我我們公司制作了,隻是這次又額外添加了一個新需求:汽車的啟動、停止、喇叭聲音、引擎聲音都有客戶自己控制,他想什麼順序就什麼順序,這個沒問題吧?”。
看着老大殷切的目光,我還能說啥,肯定的點頭,“沒問題!”,加班加點做呗,“再苦再累就當自己二百五 再難再險就當自己二皮臉 與君共勉!”這句話說出了我的心聲。
那任務是接下來,我們怎麼做實作呢?首先我們想了,奔馳、寶馬都是一個産品,他們有共同擁有的屬性,牛叉公司關心的是單個模型,奔馳模型 A 是先有引擎聲音,然後再啟動;奔馳模型 B 呢是先啟動起來,然後再有引擎聲音,這才是牛叉公司要關關心的,那到我們老大這邊呢,就是滿足人家的要求,要什麼順序就立刻能産生什麼順序的模型出來,我呢就負責把老大的要求實作掉,并且還要是批量的,看不懂?沒關系,繼續看下去,首先由我生産出 N多個奔馳和寶馬車輛模型,這些車輛模型的都有 run 方法,可是詳細到每個模型的 run 方法可能中間的執行任務的順序是不同的,老大說要啥順序,我就給啥順序,終于客戶買走後僅僅能是既定的模型。先看類圖:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5yYkBjMiZ2NmdDN2ATNmJTOmV2Y0kTNzITYlN2N4MGO08CXxMzLcdDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL5M3Lc9CX6MHc0RHaiojIsJye.png)
凝視:
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()
執行結果例如以下: