我有一个类Command
,它是类EventManager
的一个实例。 Class Command在其构造函数中需要两个参数(host
,target
)。
class EventManager
{
public:
void Event1(){ cmd->Execute(_eventEnum); }
private:
Command *cmd;
};
class Command
{
public:
Command(Host h, Target t)
void Execute();
private:
}
现在,如果我需要在Target类的成员函数中使用此方法cmd->Execute()
,我需要将cmd
设为Target的实例变量,或将其作为单例设置为全局。
我无法使cmd
成为Target的实例变量,因为它不接受主机实例。要使它成为单身,就可以添加两个这样的方法
class Command
{
public:
CreateInstance(Host h, Target t);
GetInstance();
void Execute();
private:
Command(Host h, Target t);
}
我需要确保在GetInstance
之后调用CreateInstance
。还有其他选择吗?
目标类是一个低级别的类,几乎没有事件。
Target::LowlevelEvent()
{
cmd->Execute(lowlevelevent) //In Execute for lowlevelevent in Command class, i might call target->reset
}
我很抱歉无法解释清楚。问题是,这段代码有很多事件(方法),可能在像EventManager或Target这样的类中。
在每个事件中,我都必须调用Command-> Execute()。命令类需要主机和目标实例,因为它们可以执行某些操作。
eventmanager进行::事件1() { CMD->执行(_event1); }
目标::事件2() { CMD->执行(_event2); }
Command :: Execute(事件e)
{
if(_event1 == e)
{
宿主 - > CallAction();
}
if(_event2 == e)
{
靶> CallSomeOtherAction();
}
}
那么现在cmd需要是EventManager和Target的实例变量吗?现在EventManager有主机和目标实例,可以传递给Command ctor。
但Target无法访问主机。所以我无法在Target类中创建Command实例。
所以我想知道我是否在EventManager ctor中创建了单例。然后在Target中调用GetInstance()。我知道它的坏主意,但有了这个巨大的设计,我无法弄明白。谢谢你的帮助。
答案 0 :(得分:5)
我真的不明白你的问题,但是,从标题来看,我可以说:不要使用单身。它需要参数的事实是单例模式的一个非常好的反指标。
如果要确保使用相同参数创建所有命令,可以为客户端提供创建命令实例的CommandFactory
。
class CommandFactory {
public:
CommandFactory(std::string host, std::string target)
: m_host(host),
m_target(target)
{}
boost::shared_ptr<Command> createCommand() {
return boost::shared_ptr<Command>(new Command(m_host, m_target));
}
private:
std::string m_host;
std::string m_target;
};
然后你也可以实现某种object pool来重用对象。
答案 1 :(得分:0)
绝对没有必要让Command
成为单身人士。只需使用适当的参数实例化一个,将其传递给管理器,使用它并摆脱它。您可能想要传递它,因此最好使用shared_ptr
。