用C#实现一个可继承、延迟加载、线程安全的单例模式

用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;
        }

        // ...
    }
}

猜你喜欢

转载自blog.csdn.net/qq_21397217/article/details/80447721
今日推荐