c++ - 单例替代

扫码查看

我有一个非常简单的游戏引擎。它使用了几个单例(我将列举其中一些)。

Resource Manager
Render Engine
Events Manager
Factory
etc

这些单例有许多彼此之间的呼唤。我将使用事件管理器示例用法:
  • 从Listener派生的任何对象都可以将itel添加为某些事件的侦听器,就像此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 );
        }
    
    }
    

    08-05 04:15
    查看更多