在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。 对于这些子类是否是单例,这不太可能是固有的 。