聊聊如何使用單例模式

介紹

單例模式,顧名思義就是隻有一個實例,並且她自己負責創建自己的對象,這個類提供了一種訪問其唯一的對象的方式,可以直接訪問,不需要實例化該類的對象。下面我們來看下有哪幾種實現方式吧。

實現方式

1、使用lock ,保證方法只有一個線程可以進入。

 /// <summary>
    /// 單例類
    /// </summary>
    public class Singleton
    {
        private Singleton()
        {
            long lResult = 0;
            for (int i = 0; i < 100 - 000 - 000; i++)
            {
                lResult += i;
            }
            Thread.Sleep(2000);
            Console.WriteLine($"{this.GetType().Name}完成構造....");
        }
        private static Singleton Instance = null;
        private static readonly object Singleton_Lock = new object();
        public static Singleton CreateInstance()
        {
            if (Instance == null)
            {
                lock (Singleton_Lock)//保證方法塊兒只有一個線程可以進入
                {
                    Console.WriteLine("進入lock排隊....");
                    Thread.Sleep(1000);
                    if (Instance == null)
                        Instance = new Singleton();
                }
            }
            return Instance;
        }

        public static void DoNothing()
        {
            Console.WriteLine("DoNothing");
        }

        public void Show()
        {
            Console.WriteLine($"{this.GetType().Name} Show....");
        }
    }

2、使用靜態構造函數,由CLR調用,在類型第一次被使用前調用,且只調用一次。

 /// <summary>
    /// 單例類
    /// </summary>
    public class SingletonSecond
    {
        private SingletonSecond()
        {
            long lResult = 0;
            for (int i = 0; i < 100 - 000 - 000; i++)
            {
                lResult += i;
            }
            Thread.Sleep(2000);
            Console.WriteLine($"{this.GetType().Name}完成構造....");
        }
        private static SingletonSecond Instance = null;
        /// <summary>
        /// 靜態構造函數,由CLR調用,在類型第一次被使用前調用,且只調用一次!
        /// </summary>
        static SingletonSecond()
        {
            Instance = new SingletonSecond();
        }
        public static SingletonSecond CreateInstance()
        {
            
            return Instance;
        }

        public static void DoNothing()
        {
            Console.WriteLine("DoNothing");
        }

        public void Show()
        {
            Console.WriteLine($"{this.GetType().Name} Show....");
        }
    }

3、使用靜態字段,由CLR調用,在類型第一次被使用前初始化,且只初始化一次。

 /// <summary>
    /// 單例類
    /// </summary>
    public class SingletonThird
    {
        private SingletonThird()
        {
            long lResult = 0;
            for (int i = 0; i < 100 - 000 - 000; i++)
            {
                lResult += i;
            }
            Thread.Sleep(2000);
            Console.WriteLine($"{this.GetType().Name}完成構造....");
        }
        /// <summary>
        /// 靜態字段,由CLR調用,在類型第一次被使用前初始化,且只初始化一次!
        /// </summary>
        private static SingletonThird Instance = new SingletonThird();
       
        public static SingletonThird CreateInstance()
        {
            
            return Instance;
        }

        public static void DoNothing()
        {
            Console.WriteLine("DoNothing");
        }

        public int iNum = 0;
        public void Show()
        {
            Console.WriteLine($"{this.GetType().Name} Show..{iNum++}..");
        }

        public void Add()
        {
            this.iNum++;
        }
    }

使用場景

1、需要生成唯一序列的環境。

2、需要頻繁實例化然後銷燬的對象。

3、創建對象時耗時過多或者耗資源過多,但又經常用到的對象。 

4、方便資源相互通信的環境。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章