單例模式 Singleton

模式釋義

Ensure a class only has one instance, and provide a global point of access to.多線程

保證一個類僅有一個實例,並提供一個訪問它的全局訪問點。ide

模式要點

1. 一個類只有一個實例;函數

2. 必須自行建立實例;spa

3. 自行向整個系統提供實例線程

模式實現要點

1. 單例模式的類只提供私有的構造函數;3d

2. 類定義含有類的靜態私有對象;code

3. 提供一個靜態的共有函數建立或獲取自己的靜態私有對象;對象

實現方式

image

  • 經典模式:
    class Singleton
    {
        private static Singleton instance;

        //構造方法設爲private,防止外界new建立實例
        private Singleton()
        {
        }

        //獲取本類實例的惟一全局訪問點
        public static Singleton Getinstance()
        {
            //若實例不存在,則new一個新的實例,不然返回已有實例
            if (instance == null)
            {
                instance = new Singleton();
            }
            return instance;
        }
    }

調用方法:blog

Singleton singleton = Singleton.Getinstance();
  • 多線程下的單例模式
  • 雙鎖模式(Double-Check Locking):(懶漢式單例類)

            第一次引用時,纔會將本身實例化生命週期

    class Singleton
    {
        private static Singleton instance;
        private static readonly object _syncRoot = new object();

        //構造方法設爲private,防止外界new建立實例
        private Singleton()
        {
        }

        //獲取本類實例的惟一全局訪問點
        public static Singleton Getinstance()
        {
            //先判斷實例是否存在,不存在再加鎖處理
            if (instance == null)
            {
                //lock確保當一個線程位於代碼的臨界區時,另外一個線程不進入臨界區
                //其餘線程試圖進入鎖定的代碼,它將一直等待
                lock (_syncRoot)
                {
                    //若實例不存在,則new一個新的實例,不然返回已有實例
                    if (instance == null)
                    {
                        instance = new Singleton();
                    }
                }
            }
            return instance;
        }
    }
  • 靜態初始化(餓漢式單例類):

              在本身加載時將本身實例化

   //sealed:阻止發生派生,派生可能會增長實例
    public sealed class Singleton
    {
        //readonly第一次引用類的任何成員時建立實例;
        //公共語言運行庫複測處理變量初始化
        private static readonly Singleton instance = new Singleton();

        private Singleton()
        {
        }

        public static Singleton Getinstance()
        {
            return instance;
        }
    }

單例模式優勢

1. 實例控制:阻止其餘對象實例化其本身單例對象的副本,從而保證全部對象都訪問惟一實例;

2. 靈活性

單例模式缺點

1. 開銷:每次請求時都須要檢查是否存在類的實例。用靜態初始化解決此問題。

2. 可能的開發混淆:開發時不能用new關鍵字實例化對象。

3. 對象生命週期:不能解決刪除單個對象的問題。

應用場景

資源管理器

打印機

相關文章
相關標籤/搜索