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,它会直接去判断,而不是去竞争这个锁,笔者将画一个图详细介绍一下饿汉模式。
所以总结一下饿汉模式是开始运行程序时就创建实例,我们使用的是静态存储的对象,而懒汉模式是需要的时候在栈上创建对象去使用。