C#/.NET 單例模式——懶漢式,餓漢式,三種實現方法
阿新 • • 發佈:2019-01-09
C# 單例模式 ——懶漢式,餓漢式#
註釋:
/// 單例模式
///
/// 餓漢式 :第一時間建立例項,類載入就馬上建立
/// 懶漢式 :需要才建立例項,延遲載入
///
/// 單例模式會長期持有一個物件,不會釋放
/// 普通例項使用完後釋放
///
/// 單例可以只構造一次,提升效能(如果建構函式耗效能)
///
/// 單例就是保證型別只有一個例項:計數器/資料庫連線池
///
/// 程式中某個物件,只有一個例項
懶漢式
//建構函式私有化,避免外部構建 private Singleton()//private 避免外部建立 { } //volatile 可以保證執行過程中值不會被重複修改 private static volatile Singleton _Singleton = null; private static object Singleton_Lock = new object(); public static Singleton CreateInstance() { if (_Singleton == null)//保證物件初始化之後,不在去等待鎖 { lock (Singleton_Lock)//保證只有一個執行緒進去 { if (_Singleton == null)//保證只被例項化一次 _Singleton = new Singleton(); } } return _Singleton; }//懶漢式 呼叫了方法才去構造
餓漢式——使用靜態建構函式
/// <summary> /// 建構函式耗時耗資源 /// </summary> private SingletonSecond() { } /// <summary> /// 靜態建構函式:由CLR保證,程式第一次使用這個型別前被呼叫,且只調用一次 /// /// 寫日誌功能的資料夾檢測 /// XML配置檔案 /// </summary> static SingletonSecond() { _SingletonSecond = new SingletonSecond(); } private static SingletonSecond _SingletonSecond = null; public static SingletonSecond CreateInstance() { return _SingletonSecond; }//餓漢式 只要使用類就會被構造
餓漢式——使用靜態欄位
private SingletonThird()
{
}
/// <summary>
/// 靜態欄位:在第一次使用這個類之前,由CLR保證,初始化且只初始化一次
/// </summary>
private static SingletonThird _SingletonThird = new SingletonThird();//列印個日誌
public static SingletonThird CreateInstance()
{
return _SingletonThird;
}//餓漢式 只要使用類就會被構造