突然间,我有一点OO危机.在过去的几年里,我已经很好地利用了Singleton对象.我在很多地方使用它们.
例如,在设计MVC Java应用程序时,我创建了一个Singleton'SystemRegistry'类来存储模型和视图类(我只处理过简单的应用程序,并且不需要多个视图).
当我创建我的模型并查看对象(不是单例,只是普通对象)时,我会做类似的事情:
SystemRegistry.getInstance().setModel(model);
Run Code Online (Sandbox Code Playgroud)
在我的控制器类(几乎是不同GUI项的事件处理程序)中,我可以访问视图或模型,如下所示:
SystemRegistry.getInstance().getView();
Run Code Online (Sandbox Code Playgroud)
我永远不会在我的应用程序的模型部分中使用SystemRegistry类,但有时会在我的视图中使用它来访问(但很少,如果有的话,修改)模型中的信息.
从我读过的内容(特别是Steve Yegge的文章)来看,这似乎是设计我的应用程序的一种糟糕方式.关于更好地构建代码的方法的任何想法.
此外,我设计类的另一个方面是使用'经理类型'类,这些类可能与单身人士有关,也可能与单身人士无关.一个例子是我用C++创建的(非常简单的)基于OpenGL的游戏引擎.
主要的课程是GameEngine.正是过度激励的类存储了一堆经理并处理了主循环而没有.存储在这个类中的一些管理器是:ObjectManager,RenderingManager,LightingManager,EventManager(包括输入),HUDManager,FrameRateManager,WindowManager等.可能还有一些.
基本上这些类处理游戏引擎的不同方面.名称非常简单,因此您应该能够很好地了解它们的使用方式.
现在,这应该是一个可重用的基础,我可以在不同的项目中使用,需要理想地改变它.
在每个新游戏中,我将创建一个GameEngine实例作为一个类范围的变量(大多数游戏逻辑存储在一个类中)并设置不同的管理器(例如,加载窗口坐标或照明文件中的详细信息,设置FPS等).要在ObjectManager中注册一个对象,我会做类似的事情:
Player player = new Player();
gameEngine.getObjectManager().addObject(player);
Run Code Online (Sandbox Code Playgroud)
此对象现在将存储在ObjectManager类的向量中,并在GameEngine在每个帧中调用ObjectManager drawObjects()方法时绘制.
在关于Singletons的文章之后我可能会有点偏执(可能没有足够的时间来绕过它),但我开始猜测并且想知道我设计GameEngine的方式是否合适(由于缺乏一个更好的词而且并没有陷入单身人士模式所共有的陷阱.
对我的帖子的任何评论将不胜感激.
编辑:谢谢你的回答.我非常感激他们.如果可能的话,如果有人能给我一些关于上面发布的两个项目方案的提示,我会很高兴.我怎么能避免使用单身人士/经理?
对于第一个,DI会得到正确的答案吗?我是否应该给视图访问模型(这可能更像是一个MVC响应)?该视图是否会受益于实现接口(以便可以插入多个不同的视图)?
在第二种情况下,如何构建应用程序?抱怨只是使用经理类而不是更具体的名称?或者是,在某些情况下,类可以进一步细分(例如ObjectHolder,ObjectDrawer,ObjectUpdater)?