例如,在设计MVC Java应用程序时,我会创建一个Singleton 'SystemRegistry'类来存储模型和视图类(我只处理简单的应用程序,没有出现需要多个视图的情况)。
当我创建我的模型和视图对象(它们不是单例,只是普通对象)时,我会做一些类似的事情:
SystemRegistry.getInstance().setModel(model);
在我的控制器类中(它们基本上是不同GUI项目的事件处理程序),我将按以下方式访问视图或模型:
SystemRegistry.getInstance().getView();
我不会在我的应用程序模型部分使用 SystemRegistry 类,但有时会在视图中使用它来访问(但很少甚至从不修改)模型中的信息。
从我所读到的(尤其是Steve Yegge的文章),这似乎是设计我的应用程序的一种不良方式。有什么更好的代码结构设计思路吗?
另外,我设计类的另一个方面(可能与单例模式有关,也可能不相关)是使用“管理器类型”类。例如,我创建了一个非常简单的基于OpenGL的游戏引擎,主要类是GameEngine。它是存储一堆管理器并处理主循环等的总体类。存储在此类中的一些管理器包括: ObjectManager、RenderingManager、LightingManager、EventManager(包括输入)、HUDManager、FrameRateManager、WindowManager等。可能还有一些其他的管理器。
基本上,这些类处理游戏引擎的不同方面。名称相当直观,因此您应该能够很好地了解它们的用途。
现在,这是一个可重复使用的基础,我可以在不同的项目中使用它而无需理想情况下进行更改。
在每个新游戏中,我将创建一个 GameEngine 的实例作为类范围变量(大多数游戏逻辑存储在单个类中),并设置不同的管理器(例如,从文件加载窗口坐标或光照细节,设置 FPS 等)。要在 ObjectManager 中注册对象,我会这样做:
Player player = new Player();
gameEngine.getObjectManager().addObject(player);
这个对象将存储在ObjectManager类的向量中,并且在每个帧时,当GameEngine调用ObjectManager drawObjects()方法时将被绘制。
在看完Singleton模式的文章后,我可能有点偏执(并且可能没有足够的时间来理解它),但我开始怀疑我设计的GameEngine方式是否正确(缺乏更好的词语),并且是否刚好避免了Singleton模式共享的相同陷阱。
对我的帖子进行任何评论将不胜感激。
编辑:感谢答复。 非常感激。 如果可能的话,我希望有人能在上面发布的两个项目场景方面给我一些提示。 我如何避免使用Singleton / Managers?
对于第一个问题,依赖注入是正确的响应吗? 我是否应该让视图访问模型(可能更多是MVC的响应)? 视图是否受益于实现接口(以便可以插入多个不同的视图)?
在第二种情况下,还有哪些方式可以构建应用程序? 抱怨仅仅是使用管理器类而不是更具体的名称吗? 还是,在某些情况下,类可以进一步分解(例如ObjectHolder,ObjectDrawer,ObjectUpdater)?