返回子体的单例实例

本文关键字:单例 实例 返回 | 更新日期: 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;
  }
}