在專案開發中,經常有這樣的需求:某些特殊的類在系統中只存在乙個
例項,才能確保邏輯正確,效率良好.
保證乙個類僅有乙個例項,並提供乙個該例項的全域性訪問點。
——《設計模式》gof
那麼就有接下來的一些問題?
1:如何繞過普通的建構函式,提供一種機制來保證乙個類只有乙個例項
public sealed class singleton
public static singleton instance}}
以上對於執行緒來說不安全,單執行緒中已滿足要求。
public sealed class singleton
public static singleton instance
}return instance;}}
}以上版本:
同乙個時刻加了鎖的那部分程式只有乙個執行緒可以進入
物件例項由最先進入的那個執行緒建立
後來的執行緒在進入時(instence == null)為假,不會再去建立物件例項
增加了額外的開銷,損失了效能
public sealed class singleton
public static singleton instance}}
return instance;}}
}多執行緒安全
執行緒不是每次都加鎖
允許例項化延遲到第一次訪問物件時發生
public sealed class singleton
private singleton()
public static singleton instance}}
依賴公共語言執行庫負責處理變數初始化
公共靜態屬性為訪問例項提供了乙個全域性訪問點
對例項化機制的控制權較少(.net代為實現)
靜態初始化是在 .net 中實現 singleton 的首選方法
public sealed class singleton
public static singleton instance
}private class nested
internal static readonly singleton instance=null;}}
初始化工作由nested類的乙個靜態成員來完成,這樣就實現了延遲初始化
singleton模式中的例項構造器可以設定為protected以允許子類派生。
singleton模式一般不要支援icloneable介面,因為這可能會導致多個物件例項,與singleton模式的初衷違背。
singleton模式一般不要支援序列化,因為這也有可能導致多個物件例項,同樣與singleton模式的初衷違背。
singletom模式只考慮到了物件建立的管理,沒有考慮物件銷毀的管理。就支援垃圾**的平台和物件的開銷來講,我們一般沒有必要對其銷毀進行特殊的管理。
singleton模式是限制而不是改進類的建立。
理解和擴充套件singleton模式的核心是「如何控制使用者使用new對乙個類的構造器的任意呼叫」。
可以很簡單的修改乙個singleton,使它有少數幾個例項,這樣做是允許的而且是有意義的。
單例模式 單例模式
餓漢式 急切例項化 public class eagersingleton 2.宣告靜態成員變數並賦初始值 類初始化的時候靜態變數就被載入,因此叫做餓漢式 public static eagersingleton eagersingleton new eagersingleton 3.對外暴露公共的...
單例 單例模式
簡單的實現乙個單例 instancetype sharedinstance return instance 真正的單例模式 myclass sharedinstance return instance id allocwithzone nszone zone return nil id copywi...
單例模式 懶漢式單例模式
單例模式有餓漢時模式和懶漢式 單例模式也就是說同一類只返回乙個物件供外部類使用 懶漢式即延遲初始化單例。在多執行緒環境下,簡單的懶漢式會有執行緒安全。懶漢式單例模式解決線性安全問題如下 1 使用雙重檢查鎖機制解決執行緒安全問題。2 單例模式還有更好的解決方案,即使用靜態類方式。懶漢式單例模式典型 p...