設計模式——單例模式學習筆記
阿新 • • 發佈:2018-12-12
一、目的:為了保證應用該模式的類只有一個例項,即一個類只有一個物件例項。
二、要點:
1、某個類只能有一個例項
2、必須自行建立這個例項
3、必須自行向整個系統提供這個例項
三、實現角度:
1、單例模式的類只提供私有的建構函式
2、類定義中含有一個該類的靜態私有物件
3、該類提供了一個靜態的公有的函式用於建立或獲取它本身的靜態私有物件。
四、應用場景 1.需要頻繁例項化然後銷燬的物件。 2.建立物件時耗時過多或者耗資源過多,但又經常用到的物件。 3.有狀態的工具類物件。 4.頻繁訪問資料庫或檔案的物件。
五、例項(C# 為例)
1、雙if判斷加鎖
public class Singleton { private static Singleton _instance = null; private static object Singleton_Lock = new object(); public static Singleton CreateInstance() { if (_instance == null) //保證物件初始化之後的執行緒不需要等待鎖 { lock (Singleton_Lock) { if (_instance == null)//物件為空才建立 _instance = new Singleton(); } } return _instance; } private Singleton() { } }
2、利用靜態建構函式的特性
public class Singleton { private static Singleton _instance = null; private static object Singleton_Lock = new object(); /// <summary> /// 靜態建構函式:在第一次使用這個類之前呼叫,且只會呼叫一次 /// </summary> static Singleton() { _instance = new Singleton(); } public static Singleton CreateInstance() { return _instance; } /// <summary> /// 私有建構函式 /// </summary> private Singleton() { } }
3、更簡單的一種方式,利用靜態變數的特性
public class Singleton
{
/// <summary>
/// 私有建構函式
/// </summary>
private Singleton()
{
}
//靜態變數:在型別第一次使用時初始化,並且只會初始化一次
private static Singleton _instance = new Singleton();
private static object Singleton_Lock = new object();
public static Singleton CreateInstance()
{
return _instance;
}
}
有寫的不好或理解有誤的地方,歡迎指正!