設計模式-單例模式(Singleton)

單例模式(Singleton)能夠說是最簡單也是最多見的設計模式了;設計模式

單例模式保證一個類僅有一個實例;單例模式根據初始化形式分爲懶漢模式餓漢模式安全

 

下面4種方式爲單利模式的實現代碼,推薦使用後兩種。 多線程

第一種:最簡單的最不推薦的方式:函數

缺點:該方式在多線程的程序中可能會建立多個實例spa

  public class Singleton
  {
        private static Singleton instance;  
        /// <summary>
        /// 默認構造函數必須設置爲private;禁止在類外建立對象實例
        /// </summary>
        private Singleton() { }

        /// <summary>
        /// 單線程下的單利模式
        /// 缺點:在多線程中,可能會存在多個實例
        /// </summary>
        /// <returns></returns>
        public static Singleton GetInstance()
        {
            if (instance == null)
            {
                instance = new Singleton();
            }
            return instance;
        } 
    }

 

第二種:在建立對象時加鎖,保證能夠在多線程程序中使用線程

缺點:每次訪問必須加鎖,因此執行效率至關較低因此也不推薦設計

public class ThreadSingleton
    {
        private static ThreadSingleton instance;
        private static readonly object obj = new object();
        private ThreadSingleton() { } 

        /// <summary>
        /// 多線程下的單利模式;
        /// 缺點:每次訪問都要進行lock,下降程序執行效率
        /// </summary>
        /// <returns></returns>
        public static ThreadSingleton GetInstance()
        {
            lock (obj)
            {
                if (instance == null)
                {
                    instance = new ThreadSingleton();
                }
            }
            return instance;
        } 
    }

 

第三種:能夠在多線程中程序中應用,該方式不用線程每次都加鎖,只有在實例未建立的時候才加鎖處理。同時保證了多線程的安全,因此該方式稱爲雙重鎖定。code

public class DoubleCheckLockingSingleton
    {
        private static DoubleCheckLockingSingleton instance;
        private static readonly object obj = new object(); 
        private DoubleCheckLockingSingleton() { }

        /// <summary>
        /// 雙重鎖定
        /// 不用線程每次都加鎖,只有在實例未建立的時候須要加鎖,提升程序執行效率
        /// </summary>
        /// <returns></returns>
        public static DoubleCheckLockingSingleton GetInstance()
        {
            if (instance == null)
            {
                lock (obj)
                {
                    if (instance == null)
                    {
                        instance = new DoubleCheckLockingSingleton();
                    }
                }
            }
            return instance;
        } 
 }

 

第四種:C#自己提供了一種「靜態初始化」的方法,這種方法不須要開發人員顯式的編寫線程安全代碼,即可以解決多線程中的不安全問題。和第三種方式相比這種方式編寫的代碼最簡潔,因此也是最推薦的一種方式。對象

「靜態初始化」方式在程序加載時就實現了實例化,因此被形象的稱爲餓漢單例模式;上面三種方式在第一次被引用的時候才實例化,因此稱爲懶漢單例模式blog

    /// <summary>
    /// 添加sealed關鍵字,阻止派生類;派生類可能會增長實例
    /// </summary>
    public sealed class SealedSingleton
    {
        /// <summary>
        /// 在第一次引用該類時進行初始化;
        /// 這種靜態初始化的方式在加載時就初始化對象,因此被形象的成爲餓漢模式
        /// </summary>
        private static readonly SealedSingleton instance = new SealedSingleton();
        private SealedSingleton() { }

        public static SealedSingleton GetInstance()
        {
            return instance;
        }
    }
相關文章
相關標籤/搜索