返回子体的单例实例
本文关键字:单例 实例 返回 | 更新日期: 2023-09-27 18:21:04
我有几个类是singleton,所以我尝试用方法GetInstance(params)和派生类创建一个父基类,它应该实现这个方法并返回自身的实例(所以我不必强制转换它们)。。。由于它们是singleton,所以方法应该是静态的,但不允许重写静态方法。编写代码的最佳方法是什么?我想要的示例代码:
public class Base {
public static virtual T GetInstance<T>() where T : class;
}
public class Derived {
Derived instance;
public static override T GetInstance<T>() where T : typeOf(this){
if (instance == null) {
instance = new Derived();
}
return instance;
}
}
在这个之外的代码中,我想调用
Derived.GetInstance().SomeDerivedMethod()
不是
(Derived.GetInstance() as Derived).SomeDerivedMethod() and not
new Derived().getInstance().SomeDerivedMethod()
我知道这不好,而且我对T型也缺乏经验,所以欢迎任何建议。感谢
编辑:
或者,如果可以在Base中以某种方式定义GetInstance()方法,则派生类不需要ovwerride它,但它将返回调用它的类的实例。。。Derived.GetInstance()将返回Derived 的实例
您可以将Dictionary<Type, Object>
用于单身人士。下面的方法要求每个类型实现构造函数private。当然,如果singletones字典中已经有派生类的实例,那么您也可以在每个派生类中进行检查。这甚至可以避免有人使用Activator
来创建实例。
未测试:
public class Base {
static Dictionary<Type, Object> _Singletones = new Dictionary<Type, Object>();
public static T GetInstance<T>() where T : class {
Type t = typeof(T);
if (_Singletones.ContainsKey(t))
return _Singletones[t] as T;
else {
// Create instance by calling private constructor and return it
T result = Activator.CreateInstance(t, true) as T;
_Singletones.Add(t, result);
return result;
}
}
}
尝试抽象工厂设计模式。也许其他创造性的设计模式也适合。
您需要在工厂级别强制执行"singletoness",然后调用可能看起来像:
FooFactory.GetBarInstance().SomeDerivedMethod();
这不是一个真正的答案,但也许知道这一点很好。懒惰
为什么不简单地将方法声明为非泛型并直接使用派生类型:
public class Derived {
Derived instance;
public static Derived GetInstance() {
if (instance == null) {
instance = new Derived();
}
return instance;
}
}