C#中的单例模式

单例模式现在有二种,第一个是饿汉模式,第二个是懒汉模式。笔者将去实现这2个例子,然后分析它们的优缺点。

1.饿汉模式

using System;
namespace DesignMode
{
    class SingletonMode
    {
        public static SingletonMode instance { get; private set; } = null;
        private SingletonMode()
        {
            Console.WriteLine("构造函数");
        }

        static SingletonMode()///Clr运行的时候,进行初始化,并且只执行一次
        {
            instance = new SingletonMode();
        }

        public void Print()
        {
            Console.WriteLine("Hello World!!");
        }

    }
}

个人比较推荐饿汉模式,因为在Clr运行的时候,进行初始化,并且只执行一次,不用管什么多线程之类的问题,也不用担心性能问题,因为在最开始的时候不管你要不要这个实例,都会被创建出来,所以只是在程序开始的时候消耗时间,到程序结束前不会销毁

2.懒汉模式

using System;

namespace DesignMode
{
    class SingletonMode
    {
        private static bool IsState = false;
        private static object Singleton_Lock = new object();
        public static SingletonMode _instance  = null;
        private SingletonMode()
        {
            lock(Singleton_Lock)
            {
                if (IsState == false)
                {
                    Console.WriteLine("构造函数");
                    IsState = true;
                }
                else {
                    Console.WriteLine("构造已经完成");
                }         
            }   
        }
        
        public static SingletonMode CreateInstance() {
            if (_instance == null)
            {
                lock (Singleton_Lock)//线程锁
                {
                    if (_instance == null) {
                        _instance = new SingletonMode();
                    }
                }
            }
            return _instance;
        }


        public void Print()
        {
            Console.WriteLine("Hello World!!");
        }


    }
}

懒汉模式笔者是不太推荐的,当这个类的实例需要的是才会创建出来,调用CreateInstance这个函数去创建,这里有个经典的问题为什么是双层判断,其实第一层判断去掉也没有错误,只是性能上的问题,比如我在一个地方第二次调用了CreateInstance,它会直接去判断,而不是去竞争这个锁,笔者将画一个图详细介绍一下饿汉模式。

C#中的单例模式

所以总结一下饿汉模式是开始运行程序时就创建实例,我们使用的是静态存储的对象,而懒汉模式是需要的时候在栈上创建对象去使用。