我已经使用受保护的构造函数声明了一个单例类,并在其他类中派生。因此,派生类实例可以是单例还是非单例。
是否有办法保持派生类也是单身?
答案 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)
这取决于实施。单身人士通常有私人构造函数,可能标记为密封,如果单例类有私有构造函数,你将无法继承它。如果它至少受到保护,你可以。如果你只是从单例类继承,那么结果将不是单例,所以你应该遵循模式并使它也是单例。