用C#实现一个可继承、延迟加载、线程安全的单例模式
参考文献:C#单例模式的实现和性能对比
namespace SingletonDemo
{
/// <summary>
/// 单例模式基类,继承此类的子类要在公共无参构造方法里进行一下单实例检查。
/// <typeparam name="T"></typeparam>
public abstract class SingletonBase<T> where T : SingletonBase<T>, new()
{
protected static T _instance;
public static T Instance
{
get { return Nested.instance; }
}
private class Nested
{
internal static readonly T instance;
// 静态构造方法,实现延迟加载,且只执行一次
static Nested()
{
if (_instance == null) _instance = new T();
instance = _instance;
}
}
public class SingletonException : Exception
{
private string _message = string.Format("{0} is a Singleton. Please use [{1}.Instance] to instead of [new {2}()].", typeof(T).Name, typeof(T).Name, typeof(T).Name);
public override string Message
{
get
{
return _message;
}
}
}
}
// 单例模式子类
public class SubSingletonClass : SingletonBase<SubSingletonClass>
{
// 为了实现继承单例,不得不提供一个public的构造方法
// 因此需要判断该类是否已经存在实例,以防通过new多次创建对象
public SubSingletonClass()
{
if (_instance != null) throw new SingletonException();
_instance = this;
}
// ...
}
}