单例模式最重要的是不要被new来使用,在C++中可以把构造函数设置为私有或者虚继承等方法来防止被new来使用,在C#中也可以通过下面代码来实现。如果被new了,那么_instance一定是null的,在使用单例的之前,我们可以先用Init()来初始化,其他情况也可以先用CheckSingleton来检查是否被正确调用。注意这不是一个线程安全的单例。
public abstract class ServiceModule<T>:Module where T : ServiceModule<T>,new()
{
private static T _instance;
public static T Instance
{
get { return _instance ?? (_instance = new T()); }
}
//在派生类中检查
protected void CheckSingleton()
{
if (_instance == null)
{
Exception e = new Exception("这是一个单例,无法实例化");
throw e;
}
}
protected virtual void Init()
{
this.Log("Init()");
CheckSingleton();
}
}