我已经声明了一个带有受保护构造函数的单例类,并在其他类中派生。所以派生类实例可以是单例,也可以不是。
有没有办法让派生类也保持单例?
这是我使用的良好线程安全单例类的列表:
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 个 :)
这取决于实施。单例通常具有私有构造函数并且可能标记为密封,如果单例类具有私有构造函数,您将无法继承它。如果它至少受到保护,你可以。如果您只是从单例类继承,则结果不会是单例,因此您应该遵循该模式并将其设为单例。
通常单例类是密封的(将阻止继承),因此派生类不会破坏单例。
但是如果必须从类派生,那么派生类可以选择实现为Singleton。但是您不能仅使用继承过程来强制执行它。