2

在已经存在的模拟框架中,我试图在已经存在的模型抽象基类上实现状态模式。由于模型类只是一个 ABC,因此状态也应该是。我正在寻找一种方法来对州 ABC 的所有可能的子类强制执行单例模式。

这是我到目前为止所尝试的:

template<typename T> class SingletonBase
{
public:
[...]
static T* getInstance()
{
    if (instance == nullptr)
    {
        instance = new T();
    }
    return instance;
}
protected:
  SingletonBase(){}
  static T* instance;

这是我所在州的ABC:

template <typename A, typename B, typename StateType>
class State : public SingletonBase<StateType>
{
public:
  virtual ~State(){}

  virtual void foo(Context<A,B,StateType>* ctx, ...) = 0;

  virtual void bar(Context<A,B,StateType>* ctc, ...) = 0;

protected:
  State(){}

virtual void changeState(Context<A, B, StateType>* ctx, State<A, B, StateType>* state);

private:
  friend class SingletonBase<State<A, B, StateType>>;
};

上下文类采用相同的三个模板参数,因为它需要知道其状态的类型。并且一个新的类模板最终继承自 Context 和所用模型的 ABC。

我现在尝试为在模拟中使用的具体状态创建一个基类,方法如下(需要这个基类,以便所有 Context 具有相同的类型):

class StateBaseForSimulationScenario : public State<foobar, barfoo, StateBaseForSimulationScenario>

现在我遇到两个问题:

1)显然状态库的每个孩子的getInstance()方法只会产生一个状态库

2)如果我不使用 statebase 类型作为模板参数,而是使用具体类型,则 Context 将不匹配(例如,带有参数 StateIdle 的 Context 显然与带有参数 StateProducing 的 Context 类型不同)

所以我的问题是:有没有办法强制所有未来的 State 子类成为 Singleton?或者在 C++ 中这种方式是不可能的?

PS:如果您的回答是 Sigletons 是一种反模式/不良设计等,或者我应该使用 boost:请不要。谢谢。

4

0 回答 0