这是我的抽象类,每次我想制作一个 Singleton 时都必须派生它:
public abstract class Singleton<T> where T : Singleton<T>
{
private static readonly Lazy<T> _instance = new Lazy<T>(() =>
{
var constructor = typeof(T).GetConstructor(BindingFlags.NonPublic |
BindingFlags.Instance, null, new Type[0], null);
return (T)constructor.Invoke(null);
});
public static T Instance { get { return _instance.Value; } }
public Singleton() { }
}
因此,每次我需要遵循单例设计模式时,我可以这样做:
sealed class Server : Singleton<Server>
{
private Server() { }
...
}
这是否完全正确,如果不正确,为什么?
编辑:
- 在派生类示例中添加私有(private)构造函数并在抽象基础上调用。
编辑:
- 重新设计了类型参数初始化。
最佳答案
不,你不能,因为当你想使用 new T()
时,你应该有一个公共(public)构造函数,它不同于单例定义。因为在单例中你应该有一个私有(private)构造函数,在这种情况下(公共(public)构造函数)每个人都可以创建你的对象的新实例并且它不是单例。
关于c# - 我可以用这种方式为所有派生的单例定义一个抽象类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8036883/