单例类继承

时间:2013-08-01 05:45:05

标签: c# .net

我已经使用受保护的构造函数声明了一个单例类,并在其他类中派生。因此,派生类实例可以是单例还是非单例。

是否有办法保持派生类也是单身?

3 个答案:

答案 0 :(得分:2)

这是我使用的好的线程安全单例类的列表:

namespace Helpers.DesignPatterns
{
public class Singleton<T> where T : class
{
    private static volatile T _instance;
    private static object _syncRoot = new Object();

    protected Singleton()
    {
    }

    private static T CreateInstance()
    {
        ConstructorInfo cInfo = typeof(T).GetConstructor(
            BindingFlags.Instance | BindingFlags.NonPublic,
            null,
            new Type[0],
            new ParameterModifier[0]);

        return (T)cInfo.Invoke(null);
    }

    /// <summary>
    /// Точка входа синглтона
    /// </summary>
    public static T Instance
    {
        get
        {
            if (_instance == null)
            {
                lock (_syncRoot)
                {
                    if (_instance == null)
                        _instance = CreateInstance();
                }
            }

            return _instance;
        }
    }
  }
}

创建被剥夺的类极其简单:

class CredentialsManager : Singleton<CredentialsManager>

但通常在项目中拥有超过1个单例类并不是一个很好的解决方案。我有4个人:)

答案 1 :(得分:0)

通常Singleton类被密封(将阻止继承),因此派生类不会破坏Singleton。

但是如果必须从类中派生,那么派生类可以选择来实现为Singleton。但是,仅使用继承过程不能强制执行它。

答案 2 :(得分:0)

这取决于实施。单身人士通常有私人构造函数,可能标记为密封,如果单例类有私有构造函数,你将无法继承它。如果它至少受到保护,你可以。如果你只是从单例类继承,那么结果将不是单例,所以你应该遵循模式并使它也是单例。

相关问题