【发布时间】:2026-02-20 04:35:01
【问题描述】:
这是我每次要创建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() { }
...
}
这完全正确吗?如果不是,为什么?
编辑:
- 在派生类示例中添加了私有构造函数并在抽象基础上调用。
编辑:
- 重做类型参数初始化。
【问题讨论】:
-
你的构造函数不应该是私有的还是受保护的?
-
@vc74 在这种情况下不是。试一试,你会发现不创建构造函数就无法派生。
-
如果 Singleton 类的构造函数是私有的,您将收到编译错误消息:“Singleton
.Singleton()”由于其保护级别而无法访问。您需要使 Singleton 类的构造函数受到保护。 -
静态只读
_instance字段将在Singleton<T>的所有实例之间共享。不管你创建多少泛型类型的对象,你都会有一个Instance对象。术语有点偏离,这更像是享元模式而不是单例模式。 -
您的编辑对您的问题进行了很多更改,我的回答对您的第一个问题有效,总而言之,最好提出一个新问题,而不是完全改变原始问题的面貌。
标签: c# .net c#-4.0 singleton abstract-class