我有一个非常简单的游戏引擎。它使用了几个单例(我将列举其中一些)。
Resource Manager
Render Engine
Events Manager
Factory
etc
这些单例有许多彼此之间的呼唤。我将使用事件管理器示例用法:
EventsManager->RegisterListener(this, &SomeClass::SomeMethod);
(事件类型由SomeMethod参数推导出)一样EventsManager->PushEvent(SomeEvent);
进行一些同步后,事件将到达所有侦听器。对于单例的EventsManager,这是非常简单的用法。
其他单例也有类似的行为。我想删除单例,但是我的主要问题是我希望从现在的“用户角度”保持代码易于使用。我读了一些技巧,但是大多数使类的初始化/使用更加复杂。我知道这个话题在SO上讨论了很多次,但是没有答案适合我的编程哲学-保持一切尽可能简单。
我不想为我的类进行复杂的定义/初始化:
SomeClass<EventManager, RenderEngine,...>
或者
SomeClass::SomeClass(EventsManager, RenderEngine...)
您能给我一些关于这个话题的建议吗?
最佳答案
您可以有一个全局“游戏”对象,该对象创建当前为单例的每个类的实例。
对于您的EventManager的特定示例;您的Listener基类可以提供注册方法和派生类可以调用的push方法的实现。
骨架定义:
class Listener
{
public:
virtual void ReceiveMessage( ... ) = 0;
protected:
void Register()
{
GetEventManagerSomehow()->RegisterListener( this, etc );
}
void PushEvent( etc )
{
GetEventManagerSomehow()->PushEvent( etc );
}
}