Lua 簡單單例設計模式


單例設計模式是開發過程中使用最為廣泛的設計模式之一,比如在一個業務場景下,需要一個管理工具,這個管理工具整個過程只需要一份即可,比如常用的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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM