設計模式(C#實現)--單例模式(多種實現方式)

這種類型的設計模式屬於創建型模式,它提供了一種創建對象的最佳方式。

這種模式涉及到一個單一的類,該類負責創建自己的對象,同時確保只有單個對象被創建。這個類提供了一種訪問其唯一的對象的方式,可以直接訪問,不需要實例化該類的對象。

實現思路:
1:私有化構造方法
2:暴露創建對象的方法
3:存儲創建的對象

方法1:

        public static SingletonClass _singleton = null;
        public static readonly object lockObj = new object();
        public void Show()
        {
 			Console.WriteLine("Singleton............");
        }
 		public static SingletonClass GetInstance()
        {
            if (_singleton == null)
             {
            	  _singleton = new SingletonClass();
          	 }
         }
        private SingletonClass()
        {
            var IResult = 0L;
            for (int i = 0; i < 1000000; i++)
            {
                IResult += i;
            }
            Thread.Sleep(1000);
            Console.WriteLine("SingletonClass被構造。。。。。。。");
        }

調用:

 for (int i = 0; i < 10; i++)
 {
   SingletonClass singleton = SingletonClass.GetInstance();
   singleton.Show();
 }

在這裏插入圖片描述
這種方式在非多線程下是可以達到目的,但是在多線程下就會出現下面的結果:

  for (int i = 0; i < 5; i++)
  {
     Task.Run(() =>
       {
            SingletonClass singleton = SingletonClass.GetInstance();
            singleton.Show();
       });
  }

在這裏插入圖片描述
解決方式 :雙重if加鎖

  if (_singleton == null)
            {

                lock (lockObj)
                {
                    if (_singleton == null)//不多餘
                    {
                        _singleton = new SingletonClass();
                    }
                }
            }

在這裏插入圖片描述
方法3:
使用靜態構造函數或者靜態字段

  public sealed class SingletonSecClass
    {
        public static SingletonSecClass _singletonSec = null;

        //靜態字段
        // public static SingletonSecClass _singletonSec =new SingletonSecClass();
        private SingletonSecClass()
        {
            var IResult = 0L;
            for (int i = 0; i < 1000000; i++)
            {
                IResult += i;
            }
            Thread.Sleep(1000);
            Console.WriteLine("SingletonSecClass被構造。。。。。。。");

        }

        static SingletonSecClass()
        {
            _singletonSec = new SingletonSecClass();
        }
   

        public static SingletonSecClass GetInstance()
        {
            return _singletonSec;
        }
        public void Show()
        {
            Console.WriteLine("Singleton............");
        }
    }
    for (int i = 0; i < 5; i++)
            {
                Task.Run(() =>
                {
                    SingletonSecClass singletonSec = SingletonSecClass.GetInstance();
                    singletonSec.Show();
                });
            }

在這裏插入圖片描述

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