單例模式及常見寫法分析(設計模式01)
——《設計模式》
單例模式的概念很簡單,下面以C#語言為例子,列出常見單例寫法的優缺點。
1、簡單實現
public sealed class Singleton
{
static Singleton instance = null;
public void Show()
{
Console.WriteLine( "instance function");
}
private Singleton()
{
}
public static Singleton Instance
{
get
{
if (instance == null)
{
instance = new Singleton();
}
return instance;
}
}
}
評註: 對於執行緒來說不安全
單執行緒中已滿足要求
優點:
由於例項是在 Instance 屬性方法內部建立的,因此類可以使用附加功能
直到物件要求產生一個例項才執行例項化;這種方法稱為“惰性例項化”。惰性例項化避免了在應用程式啟動時例項化不必要的 singleton。
2、執行緒的安全
public sealed class Singleton
{
static Singleton instance = null;
private static readonly object padlock = new object();
private Singleton()
{
}
public static Singleton Instance
{
get
{
lock (padlock)
{
if (instance == null)
{
instance = new Singleton();
}
}
return instance;
}
}
}
同一個時刻加了鎖的那部分程式只有一個執行緒可以進入
物件例項由最先進入的那個執行緒建立
後來的執行緒在進入時(instence == null)為假,不會再去建立物件例項
增加了額外的開銷,損失了效能
3、雙重鎖定
public sealed class Singleton
{
static Singleton instance = null;
private static readonly object padlock = new object();
private Singleton()
{
}
public static Singleton Instance
{
get
{
if (instance == null)
{
lock (padlock)
{
if (instance == null)
{
instance = new Singleton();
}
}
}
return instance;
}
}
}
評註: 多執行緒安全
執行緒不是每次都加鎖
允許例項化延遲到第一次訪問物件時發生
4、靜態初始化
public sealed class Singleton
{
private static readonly Singleton instance = null;
static Singleton()
{
instance = new Singleton();
}
private Singleton()
{
}
public static Singleton Instance
{
get
{
return instance;
}
}
}
評註: 依賴公共語言執行庫負責處理變數初始化
公共靜態屬性為訪問例項提供了一個全域性訪問點
對例項化機制的控制權較少(.NET代為實現)
靜態初始化是在 .NET 中實現 Singleton 的首選方法
小注:
靜態建構函式既沒有訪問修飾符,C#會自動把他們標記為private,之所以必須標記為private,
是為了阻止開發人員寫的程式碼呼叫它,對它的呼叫總是由CLR負責的。
5、延遲初始化
public sealed class Singleton
{
private Singleton()
{
}
public static Singleton Instance
{
get
{
return Nested.instance;
}
}
public static void Hello()
{
}
private class Nested
{
internal static readonly Singleton instance = null;
static Nested()
{
instance = new Singleton();
}
}
}
評註:初始化工作由Nested類的一個靜態成員來完成,這樣就實現了延遲初始化。
由於靜態函式的呼叫時機,是在類被例項化或者靜態成員被呼叫的時候進行呼叫,並且是由.net框架來呼叫靜態建構函式來初始化靜態成員變數, 所以,如果按照寫法四來寫,再呼叫Hello方法的時候,就會例項化出來Singleton例項,這不是我們想看到的,因為我們有可能只是想用Hello方法,而不是別的。
注意事項:
1、Singleton模式中的例項構造器可以設定為protected以允許子類派生。
2、Singleton模式一般不要支援ICloneable介面,因為這可能會導致多個物件例項,與Singleton模式的初衷違背。
3、Singleton模式一般不要支援序列化,因為這也有可能導致多個物件例項,同樣與Singleton模式的初衷違背。
4、Singletom模式只考慮到了物件建立的管理,沒有考慮物件銷燬的管理。就支援垃圾回收的平臺和物件的開銷來講,我們一般沒有必要對其銷燬進行特殊的管理。
總結:
1、Singleton模式是限制而不是改進類的建立。
2、理解和擴充套件Singleton模式的核心是“如何控制使用者使用new對一個類的構造器的任意呼叫”。
3、可以很簡單的修改一個Singleton,使它有少數幾個例項,這樣做是允許的而且是有意義的。
作者:jiankunking 出處:http://blog.csdn.net/jiankunking
本文部分內容來自網路,截圖部分來自《CLR.via.C#第三版》
相關文章
- Golang 常見設計模式之單例模式Golang設計模式單例
- 01 設計模式之單例模式設計模式單例
- 設計模式 - 單例模式Singleton的8種寫法設計模式單例
- 01.單例模式設計思想單例模式
- 常見的三種工廠模式區別及單例模式模式單例
- 設計模式(單例模式)設計模式單例
- [設計模式] 單例模式設計模式單例
- 設計模式-單例模式設計模式單例
- 設計模式 —— 單例模式設計模式單例
- 設計模式 單例模式設計模式單例
- 設計模式——單例模式設計模式單例
- 2.C#設計模式系列01_單例模式_SingletonC#設計模式單例
- 設計模式-單例模式、多例模式設計模式單例
- 設計模式之單例設計模式設計模式單例
- 設計模式(一)_單例模式設計模式單例
- 常用設計模式-單例模式設計模式單例
- 設計模式之單例模式設計模式單例
- Java設計模式【單例模式】Java設計模式單例
- Java設計模式 | 單例模式Java設計模式單例
- 001設計模式:單例模式設計模式單例
- # Python設計模式 單例模式Python設計模式單例
- 設計模式一(單例模式)設計模式單例
- 設計模式之☞單例模式設計模式單例
- Java設計模式——單例模式Java設計模式單例
- Java設計模式–單例模式Java設計模式單例
- js設計模式--單例模式JS設計模式單例
- Java設計模式-單例模式Java設計模式單例
- 設計模式(二)——單例模式設計模式單例
- 設計模式之---單例模式設計模式單例
- Java設計模式--單例模式Java設計模式單例
- Python設計模式——單例模式Python設計模式單例
- 設計模式—singleton(單例模式)設計模式單例
- python設計模式-單例模式Python設計模式單例
- 單例模式(下)---聊一聊單例模式的幾種寫法單例模式
- 單例模式(下) - 聊一聊單例模式的幾種寫法單例模式
- 單例模式(下) – 聊一聊單例模式的幾種寫法單例模式
- 設計模式總結 —— 單例設計模式設計模式單例
- JavaScript設計模式初探--單例設計模式JavaScript設計模式單例
- 單例設計模式單例設計模式