設計模式例項(Lua)筆記之三(Singleton單例模式)
阿新 • • 發佈:2019-01-05
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()
執行結果,如下: