Singleton class inheritance

本文关键字:inheritance class Singleton | 更新日期: 2023-09-27 18:25:42

我已经声明了一个带有受保护构造函数的单例类,并在其他类中派生。所以派生类实例可以是singleton也可以不是singleton。

有没有办法保持派生类也是单例的?

Singleton class inheritance

下面列出了我使用的良好线程安全的单例类:

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

创建derived类非常简单:

class CredentialsManager : Singleton<CredentialsManager>

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

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

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

这取决于实现。singleton通常有私有构造函数,并且可能被标记为sealed,如果singleton类有一个私有构造函数,你将无法继承它。如果它至少受到保护,你可以继承。若您只是从singleton类继承,结果将不会是singleton,所以您应该遵循该模式并使其也是singleton。