在C#中实现单例可inheritance类

我发现在C#中你可以实现一个Singleton类,如下所示:

class Singleton { private static Singleton _instance; public static Singleton Instance { get { return _instance ?? (_instance = new Singleton()); } } protected Singleton() { } } 

适用于Singleton类型的实例,即:

 var a = Singleton.Instance; var b = Singleton.Instance; Console.WriteLine(ReferenceEquals(a, b)); //Prints True. 

但是,如果我想要Singleton的派生类也遵循Singleton模式,即:

 class A:Singleton { ... } A a = A.Instance; 

在这种情况下, Singleton类访问静态成员Instance并创建一个Singleton实例,这不是目标。 此外,此解决方案还存在两个主要问题:

  • 派生类可以实现自己的构造函数并松散Singleton Pattern。
  • 如果存在Singleton另一个实例,则派生类将引用较少派生的实例

我的问题是:是否有另一种方法在C#中实现Singleton类,确保派生类也是单例?

忽略通常的“不要使用单身人士,看看你的设计。” 参数,你可以想象实现一个(假设你的派生类有默认的构造函数):

 public abstract class Singleton where T : class, new() { private static T _instance; public static T GetInstance() { if(_instance == null) _instance = new T(); return _instance; } } 

并由此得出:

 public class SingletonA : Singleton { /* .... */ } public class SingletonB : Singleton { /* .... */ } 

但是,我个人并不主张采用这种单身方法。 他们确实有他们的(罕见的)用途,但他们可能会变得更加痛苦 – 转向美化的全球变量容器。

另外,请注意线程安全性。

我的问题是:是否有另一种方法在C#中实现Singleton类,确保派生类也是单例?

好吧,你可以在构造函数中进行某种检查:

  • 它的实际类型是密封的
  • 它的实际类型是Singleton的直接子类
  • 没有创建该类型的其他实例(通过保持HashSet

但是,它似乎毫无意义。 你的基类实际上意味着什么?

单例模式很容易正确实现 (顺便说一下,你的例子不是 – 它不是线程安全的)所以为什么要有基类? 基类本身不是单例(可能有很多实例 – 每个子类一个)所以有什么好处?

在我看来,“我是对象的实际类型的单身人士”首先不是inheritance的适当基础,坦率地说,我尽量避免单身模式。

如果你真的想要一个基类,那应该是因为所有子类都自然地inheritance了一些常用的function。 对于这些子类是否是单例,这不太可能是固有的