建造者模式lua實現

--[[
	將一個複雜對象的構造與它的表示分離,使同樣的構建過程可以創建不同的表示,這樣的設計模式被稱爲建造者模式

	1 當創建複雜對象的算法應該獨立於該對象的組成部分以及它們的裝配方式時。
	2 當構造過程必須允許被構造的對象有不同表示時。

]]--

Director = {}

function Director:new(o)
	o = o or {}
	setmetatable(o,self)
	self.__index = self
	return o;
end

function Director:Construct(builder)
	if builder ~= nil then
		builder:Coating()
		builder:Engine()
		builder:Radar()
	end
end

Builder = {}

function Builder:new(o)
	o = o or {}
	setmetatable(o,self)
	self.__index = self
	return o;
end

Product = {}

function Product:new(o)
	o = o or {}
	setmetatable(o,self)
	self.__index = self
	return o;
end

function Product:Show()
	print(self.unit)
end

F22Builder = Builder:new()

function F22Builder:new(o)
	o = o or {}
	setmetatable(o,self)
	o.product = Product:new()
	self.__index = self
	return o;
end

function F22Builder:Coating()
	if self.product.unit == nil then
		self.product.unit = "F22具有:"
	end
	self.product.unit = self.product.unit.." 隱形塗料"
end

function F22Builder:Engine()
	self.product.unit = self.product.unit.." 2臺F119-PW-100發動機"
end

function F22Builder:Radar()
	self.product.unit = self.product.unit.." APG-77有源相控陣雷達"
end

function F22Builder:GetProduct()
	return self.product
end

J10Builder = Builder:new()

function J10Builder:new(o)
	o = o or {}
	setmetatable(o,self)
	o.product = Product:new()
	self.__index = self
	return o;
end

function J10Builder:Coating()
	if self.product.unit == nil then
		self.product.unit = "J10具有:"
	end
	self.product.unit = self.product.unit.." 一般塗料"
end

function J10Builder:Engine()
	self.product.unit = self.product.unit.." 1臺AL-31F發動機"
end

function J10Builder:Radar()
	self.product.unit = self.product.unit.." JL-10脈衝多普勒雷達"
end

function J10Builder:GetProduct()
	return self.product
end



--************* 建造F22 **************
theF22Builder = F22Builder:new()
Director:Construct(theF22Builder)
F22 = theF22Builder:GetProduct()
F22:Show()

--************* 建造J10 **************
theJ10Builder = J10Builder:new()
Director:Construct(theJ10Builder)
J10 = theJ10Builder:GetProduct()
J10:Show()



輸出結果:

F22具有: 隱形塗料 2臺F119-PW-100發動機 APG-77有源相控陣雷達
J10具有: 一般塗料 1臺AL-31F發動機 JL-10脈衝多普勒雷達

 

發佈了48 篇原創文章 · 獲贊 12 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章