Singleton class inheritance
本文关键字:inheritance class Singleton | 更新日期: 2023-09-27 18:25:42
我已经声明了一个带有受保护构造函数的单例类,并在其他类中派生。所以派生类实例可以是singleton也可以不是singleton。
有没有办法保持派生类也是单例的?
下面列出了我使用的良好线程安全的单例类:
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。