设计模式(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();
                });
            }

在这里插入图片描述

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