C# 設計模式-單例模式


一.介紹  

  單例模式(Singleton Pattern)。屬於創建型模式。它保證一個類僅有一個實例,並提供一個訪問它的全局訪問點。

二.實現

  結構為,一個私有的靜態變量,用於存放該實例。私有的構造函數,防止外部直接創建該類實例。

  創建單例模式有兩種方式。餓漢式和懶漢式。

  餓漢式是直接在程序中初始化一個對象實例。

//餓漢式
public class Singleton
{
    /// <summary>
    /// 私有的靜態變量,直接初始化
    /// </summary>
    private static Singleton Instance = new Singleton();

    /// <summary>
    /// 私有的構造函數
    /// </summary>
    private Singleton()
    {

    }

    /// <summary>
    /// 獲取靜態實例的靜態方法
    /// </summary>
    /// <returns></returns>
    public static Singleton GetInstance()
    {
        return Instance;
    }
}

  上面餓漢式創建的單例模式有一個缺點,就是程序不使用也會創建一個實例,這樣會占內存。而使用懶漢式創建的單例模式,是需要使用的時候,才去創建實例。

//懶漢式
public class Singleton2
{
    /// <summary>
    /// 私有的靜態變量
    /// </summary>
    private static Singleton2 Instance = null;

    /// <summary>
    /// 私有的構造函數
    /// </summary>
    private Singleton2()
    {

    }

    /// <summary>
    /// 獲取靜態實例的靜態方法
    /// </summary>
    /// <returns></returns>
    public static Singleton2 GetInstance()
    {
        if (Instance == null)
        {
            Instance = new Singleton2();
        }
        return Instance;
    }
}

  上面兩種創建單例模式的方法在單線程使用的時候沒有問題,餓漢式創建的實例在多線程中也沒有問題,懶漢式創建的實例在多線程中就會出現問題。我們可以通過lock關鍵字在多線程中保證單例。

//單例模式 雙重檢查
public class Singleton3
{
    /// <summary>
    /// 私有的靜態變量
    /// </summary>
    private static Singleton3 Instance = null;
    private static object locker = new object();

    /// <summary>
    /// 私有的構造函數
    /// </summary>
    private Singleton3()
    {

    }

    /// <summary>
    /// 獲取靜態實例的靜態方法
    /// </summary>
    /// <returns></returns>
    public static Singleton3 GetInstance()
    {
        //先檢查Instance是否為null,防止每次調用都鎖定locker,影響性能
        if (Instance == null)
        {
            //使用lock
            lock (locker)
            {
                if(Instance == null)
                {
                    Instance = new Singleton3();
                }
            }
        }
        return Instance;
    }
}

  參考 https://www.cnblogs.com/restartyang/articles/7770856.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM