單例設計模式是開發過程中使用最為廣泛的設計模式之一,比如在一個業務場景下,需要一個管理工具,這個管理工具整個過程只需要一份即可,比如常用的UI管理工具中:窗口window 的管理工具 UIWinMgr 就是一個單例,SoundMgr 整個項目中音效音樂管理工具,ResMgr 資源管理工具等等。
優點
一、實例控制
單例模式會阻止其他對象實例化其自己的單例對象的副本,從而確保所有對象都訪問唯一實例。
二、靈活性
因為類控制了實例化過程,所以類可以靈活更改實例化過程。
缺點
一、開銷
雖然數量很少,但如果每次對象請求引用時都要檢查是否存在類的實例,將仍然需要一些開銷。可以通過使用靜態初始化解決此問題。
二、可能的開發混淆
使用單例對象(尤其在類庫中定義的對象)時,開發人員必須記住自己不能使用new關鍵字實例化對象。因為可能無法訪問庫源代碼,因此應用程序開發人員可能會意外發現自己無法直接實例化此類。
三、對象生存期
不能解決刪除單個對象的問題。在提供內存管理的語言中(例如基於.NET Framework的語言),只有單例類能夠導致實例被取消分配,因為它包含對該實例的私有引用。在某些語言中(如 C++),其他類可以刪除對象實例,但這樣會導致單例類中出現懸浮引用。
第一種實現方式:
Singleton = {} function Singleton:new(o) o = o or {} setmetatable(o,self) self.__index = self return o end function Singleton:Instance() if self.instance == nil then self.instance = self:new() end return self.instance end s1 = Singleton:Instance() s2 = Singleton:Instance() if s1 == s2 then print("兩個對象是相同的實例") end
第二種方式 (在實現類lua 的 class 基礎上)
-- 定義名為 UIWinMgr的基礎類 UIWinMgr= class("UIWinMgr") UIWinMgr.instance = nil -- ctor() 是類的構造函數,在調用 UIWinMgr.new() 創建 UIWinMgr對象實例時會自動執行 function UIWinMgr:ctor(Name) self.Name = Name end function UIWinMgr:getInstance() if instance == nil then self.instance = UIWinMgr.new() self.instance:initData() end return self.instance end function UIWinMgr:initData() -- do something end