在c#中的单例模式是指在一个AppDomain中只会存在一个经过实例化的对象。单例模式的作用的避免创建更多本来不用创建的对象,因为有一些对象在使用上没有必要创建那么多,一个就够了。单例模式实现起来的话要遵循一下几个特点:
. 单例类都只有一个private的无参构造函数 . 类声明为sealed(不是必须的) . 类中有一个静态变量保存着所创建的实例的引用 . 单例类会提供一个静态方法或属性来返回创建的实例的引用(eg.GetInstance)
根据这几个特点,,首先是方法1:
public class Singleton { private static Singleton _instance; private Singleton() { } public static Singleton Instance => _instance ?? (_instance = new Singleton()); }
这样,调用Singleton的静态属性Instance可以获取这个对象的唯一的实例,但是在多线程访问中由于该操作不是原子的,还是会可能创建多个实例,所以应该在这个静态属性的逻辑中加入锁(lock),这样一来,问题解决了,但是锁对性能的损耗不能忽视,于是,又出现了没有锁的并且性能较好的一种方法:
public class AnotherSingleton { private static readonly AnotherSingleton _instance = new AnotherSingleton(); static AnotherSingleton() { } private AnotherSingleton() { } public static AnotherSingleton Instance { get { return _instance; } } }
具体方法是加入一个静态的构造函数,静态函数的作用在于初始化类级别的静态属性或字段,这种方法完美的解决了锁带来的性能损耗问题同时又实现了单例。
我的原则是有一个好用的就没必要去展示其他不好用的例子了,用这个就够了。