1. 程式人生 > >設計模式例項(Lua)筆記之三(Singleton單例模式)

設計模式例項(Lua)筆記之三(Singleton單例模式)

1.描述:

 這個模式是很有意思,而且比較簡單,但是我還是要說因為它使用的是如此的廣泛,如此的有人緣,單例就是單一、獨苗的意思,那什麼是獨一份呢?你的思維是獨一份,除此之外還有什麼不能山寨的呢?我們舉個比較難複製的物件:皇帝。
    中國的歷史上很少出現兩個皇帝並存的時期,是有,但不多,那我們就認為皇帝是個單例模式,在這個場景中,有皇帝,有大臣,大臣是天天要上朝參見皇帝的,今天參拜的皇帝應該和昨天、前天的一樣(過渡期的不考慮,別找茬哦),大臣磕完頭,擡頭一看,嗨,還是昨天那個皇帝,單例模式,絕對的單例模式,先看類圖: 


註釋:
    main(),大臣
    CEmperor,需要單例的類

    說明:很多大臣拜見的皇帝,只有一個。體現在面向物件方面,CEmperor定義一個靜態指標,和一個靜態函式,私有化建構函式、解構函式、建構函式複製、過載賦值語句。

    注意:執行緒安全,採用互斥體的方式實現。

2. 程式碼:

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

function Emperor:GetInstance()
    if self.m_pEmperor == nil then
        self.m_pEmperor = self:new()
    end

    return self.m_pEmperor
end

function Emperor:ReleaseInstance()
	if self.m_pEmperor then
		self.m_pEmperor = nil
	end
end

function Emperor:EmperorInfo()
	print("皇帝某年某日", os.date("%X", os.time()))
end

--- main ---
function main()
	pEmperor1 = Emperor:GetInstance()
	pEmperor1:EmperorInfo()

	pEmperor2 = Emperor:GetInstance()
	pEmperor2:EmperorInfo()

	if pEmperor1 == pEmperor2 then
		print("大家都是天天要上朝參見同個皇帝!")
	end
end

main()

執行結果,如下