在已经存在的模拟框架中,我试图在已经存在的模型抽象基类上实现状态模式。由于模型类只是一个 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:请不要。谢谢。