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;
在这种情况下,静态成员Instance
被Singleton
类访问,并创建一个Singleton
实例,这不是目标。此外,此解决方案还有两个主要问题:
Singleton
的另一个实例,则派生类将引用该较少派生的实例我的问题是:是否有另一种方法可以在C#中实现Singleton类,以确保派生类也是singleton?
public abstract class Singleton<T> where T : class, new()
{
private static T _instance;
public static T GetInstance()
{
if(_instance == null)
_instance = new T();
return _instance;
}
}
因此得出:
public class SingletonA : Singleton<SingletonA> { /* .... */ } public class SingletonB : Singleton<SingletonB> { /* .... */ }
但是,我真的不个人提倡这种单例方法。它们确实有其(很少)用途,但事实证明,它们更像是在痛苦中-转向荣耀的全局变量容器。还请注意线程安全性。
我的问题是:还有另一种方法可以在C#中实现Singleton类,以确保派生类也是singleton?
嗯,您
可以在构造函数中进行了以下检查:
this
的实际类型this
的实际类型是Singleton
的直接子类HashSet<Type>
)单例模式为easy to implement properly(顺便说一下,您的示例没有-线程不安全),那么为什么有基类呢?基类本身不会是单例(可能会有很多实例-每个子类一个实例),那么这样做有什么好处?
在我看来,“我是对象的实际类型的单例”一开始并不是继承的适当基础,坦率地说,无论如何,我都会尽量避免使用单例模式。
如果您真的想要基类,那应该是因为所有子类都自然地继承了一些通用功能。这些子类是否为单例,这不太可能
固有地