1. 程式人生 > 實用技巧 >C#單例模式的實現再回顧

C#單例模式的實現再回顧

一、單例模式的實現以及標準

1、例項要是static型別,保證記憶體中只有一份copy

2、不能夠外部建立,也就是通過關鍵字private私有化建構函式

3、提供一個外部訪問方法GetInstance

4、無論何時必須考慮執行緒安全問題

二、懶漢模式

需要時才建立,因此稱作懶漢模式,程式碼示例如下:

    public class Robot
    {
        private static Robot m_instance = null;
        private static readonly object obj = new object();

        // close out init
private Robot() { } public static Robot GetInstance() { if (m_instance == null) { lock (obj) { if (m_instance == null) { m_instance = new Robot(); } } }
return m_instance; } public void SayHello() { System.Console.WriteLine("hello ,form singleton robot."); } }

lock是為了保證執行緒安全,第一個if是判斷是否需要建立,第二個是為了判斷在多執行緒的情況下是否需要建立

二、餓漢模式

在宣告的時候就建立,已經餓了,不管用不用,先建立,因此使用的時候效率會高一些,但一開始就佔了記憶體,因此省時費空間

private static readonly Robot m_instance = new Robot();

// close out init
private Robot() { }

public static Robot GetInstance()
{
return m_instance;
}

public void SayHello()
{
System.Console.WriteLine("hello ,form singleton robot.");
}

}

由於利用了靜態變數的特性,因此一開始就建立完成,程式執行中又不會修改,因此執行緒安全。

三、利用.net 4.0以後的lazy模板來實現懶漢模式,並且lazy模板自動執行緒安全

    public class Robot
    {
        private static readonly Robot m_instance = new Lazy<Robot>(()=>new Robot()).Value;

        // close out init
        private Robot() { }

        public static Robot GetInstance()
        {
            return m_instance;
        }

        public void SayHello()
        {
            System.Console.WriteLine("hello ,form singleton robot.");
        }

    }

四、模板實現

如果還覺得麻煩,那麼好,可以試下一個模板

    public abstract class Singleton<T> where T : class//,new()
    {
        private static T singleton = null;

        private static readonly object obj = new object();

        protected Singleton(){}
        public static T GetInstance() 
        {
            if (singleton == null)
            {
                lock (obj)
                {
                    if (singleton == null)
                    {
                        singleton = (T)Activator.CreateInstance(typeof(T), true);
                    }
                }
            }

            return singleton;
        }
    
    }

    public class Robot:Singleton<Robot>
    {
        private Robot() { }
        public void SayHello()
        {
            System.Console.WriteLine("hello ,form singleton robot.");
        }

    }

注意:子類中需要關閉建構函式。