项目中经常会遇到单例的情况。大部分的单例代码都差不多像这样定义:
internal class SingletonOne { private static SingletonOne _singleton; private SingletonOne() { } public static SingletonOne Instance { get { if (_singleton == null) { var instance = new SingletonOne(); Interlocked.CompareExchange(ref _singleton, instance, null); } return _singleton; } } }
但是很明显的一个缺点是这个类只能用作单例。
最近看了NopCommerce对单例有个包装。觉得有点新颖 给大家分享一下。
/// <summary> /// Provides access to all "singletons" stored by <see cref="Singleton{T}"/>. /// </summary> public class Singleton { static Singleton() { allSingletons = new Dictionary<Type, object>(); } static readonly IDictionary<Type, object> allSingletons; /// <summary>Dictionary of type to singleton instances.</summary> public static IDictionary<Type, object> AllSingletons { get { return allSingletons; } } }
public class Singleton<T> : Singleton { static T instance; /// <summary>The singleton instance for the specified type T. Only one instance (at the time) of this object for each type of T.</summary> public static T Instance { get { return instance; } set { instance = value; AllSingletons[typeof(T)] = value; } } }
比如定义了一个类, 那么可以这样使用
public class Fake { } Singleton<Fake>.Instance = new Fake();