1. 程式人生 > >C#中的單例模式

C#中的單例模式

單例模式現在有二種,第一個是餓漢模式,第二個是懶漢模式。筆者將去實現這2個例子,然後分析它們的優缺點。

1.餓漢模式

using System;
namespace DesignMode
{
    class SingletonMode
    {
        public static SingletonMode instance { get; private set; } = null;
        private SingletonMode()
        {
            Console.WriteLine("建構函式");
        }

        static SingletonMode()///Clr執行的時候,進行初始化,並且只執行一次
        {
            instance = new SingletonMode();
        }

        public void Print()
        {
            Console.WriteLine("Hello World!!");
        }

    }
}

個人比較推薦餓漢模式,因為在Clr執行的時候,進行初始化,並且只執行一次,不用管什麼多執行緒之類的問題,也不用擔心效能問題,因為在最開始的時候不管你要不要這個例項,都會被創建出來,所以只是在程式開始的時候消耗時間,到程式結束前不會銷燬

2.懶漢模式

using System;

namespace DesignMode
{
    class SingletonMode
    {
        private static bool IsState = false;
        private static object Singleton_Lock = new object();
        public static SingletonMode _instance  = null;
        private SingletonMode()
        {
            lock(Singleton_Lock)
            {
                if (IsState == false)
                {
                    Console.WriteLine("建構函式");
                    IsState = true;
                }
                else {
                    Console.WriteLine("構造已經完成");
                }         
            }   
        }
        
        public static SingletonMode CreateInstance() {
            if (_instance == null)
            {
                lock (Singleton_Lock)//執行緒鎖
                {
                    if (_instance == null) {
                        _instance = new SingletonMode();
                    }
                }
            }
            return _instance;
        }


        public void Print()
        {
            Console.WriteLine("Hello World!!");
        }


    }
}

懶漢模式筆者是不太推薦的,當這個類的例項需要的是才會創建出來,呼叫CreateInstance這個函式去建立,這裡有個經典的問題為什麼是雙層判斷,其實第一層判斷去掉也沒有錯誤,只是效能上的問題,比如我在一個地方第二次呼叫了CreateInstance,它會直接去判斷,而不是去競爭這個鎖,筆者將畫一個圖詳細介紹一下餓漢模式。


所以總結一下餓漢模式是開始執行程式時就建立例項,我們使用的是靜態儲存的物件,而懶漢模式是需要的時候在棧上建立物件去使用。