介绍

单例模式,顾名思义就是只有一个实例,并且她自己负责创建自己的对象,这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。下面我们来看下有哪几种实现方式吧。

实现方式

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、方便资源相互通信的环境。