文章出處

在今天,讀書有時是件“麻煩”事。它需要你付出時間,付出精力,還要付出一份心境。--僅以《大話設計模式》來祭奠那逝去的……

單例模式:保證一個類只有一個實例,并聽一個訪問它的全局訪問點;單例的實現分為兩種,懶漢式單例模式和餓漢式單例模式

1.懶漢式單例模式

    public class Singleton
    {
        private static Singleton instance;

        //進程輔助對象,多線程同時訪問該類時,對該對象加鎖,只有一個線程可以進入
        private static readonly object syncRoot = new object();

        /// <summary>
        /// 定義個私有的構造方法,防止外界通過new創建該類的實例
        /// </summary>
        private Singleton() { }

        /// <summary>
        /// 獲取本類實例的唯一全局訪問點
        /// </summary>
        public static Singleton GetInstance()
        {
            //先判斷實例是否存在,不存在再加鎖,提高訪問性能
            if (instance == null)
            {
                lock (syncRoot)
                {
                    if (instance == null)
                    {
                        instance = new Singleton();
                    }
                }
            }

            return instance;
        }

        public void Action()
        {
            Console.WriteLine("我是單例的具體業務……");
        }
    }

 2.餓漢式單例模式

    /// <summary>
    /// 防止派生,派生可能會增加實例
    /// </summary>
    public sealed class Singleton
    {
        //由于定義為readonly,意味著只能在靜態初始化期間或者構造函數中分配變量
        private static readonly Singleton instance = new Singleton();

        /// <summary>
        /// 定義個私有的構造方法,防止外界通過new創建該類的實例
        /// </summary>
        private Singleton() { }

        /// <summary>
        /// 獲取本類實例的唯一全局訪問點(由于定義了靜態的只讀變量,因此不需要考慮線程安全問題)
        /// </summary>
        public static Singleton GetInstance()
        {
            return instance;
        }

        public void Action()
        {
            Console.WriteLine("我是單例的具體業務……");
        }
    }

   開啟場景模擬

        static void Main(string[] args)
        {
            Singleton.GetInstance().Action();
        }

 


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()