1. 程式人生 > >C#/.NET 單例模式——懶漢式,餓漢式,三種實現方法

C#/.NET 單例模式——懶漢式,餓漢式,三種實現方法

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;
}//餓漢式  只要使用類就會被構造