在一个已经存在的Simulation框架中,我正在尝试在已经存在的抽象模型基类上实现状态模式。因为模型类只是一个ABC,所以状态也应该是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 ++中无法通过这种方式实现?
P.S .:如果您的答案是Sigletons是反图案/不良设计等,或者我只是应该使用boost:请不要。谢谢。