好的OO设计--单例设计模式

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (13)

在设计MVC Java应用程序时,创建一个Singleton‘SystemRegistry’类来存储模型和视图类.

当我创建模型并查看对象,会执行如下操作:

SystemRegistry.getInstance().setModel(model);

在我的控制器类中(它们几乎是针对不同GUI项的事件处理程序),我可以访问视图或模型,如下所示:

SystemRegistry.getInstance().getView();

我永远不会在我的应用程序的模型部分使用SystemRegistry类,但有时我会使用它来访问(但很少,如果有的话,修改)来自模型的信息。

我如何设计类的另一个方面,可能是,也可能与单例无关,是使用“Manager类型”类。一个例子是我用C++创建的基于OpenGL的游戏引擎。类中存储的一些管理器是这样的:ObjectManager、RenderingManager、LightingManager、EventManager(包括输入)、HUDManager、FrameRateManager、WindowManager等等。可能还有更多的。

在每个新游戏中,我都会创建GameEngine的一个实例,作为一个类范围的变量(大部分游戏逻辑存储在一个类中),并设置不同的管理器(例如,从文件加载窗口协调或照明详细信息,设置FPS等)。要在ObjectManager中注册对象,我需要执行如下操作:

Player player = new Player();
gameEngine.getObjectManager().addObject(player);

这个对象现在将存储在ObjectManager类中的一个向量中,并在GameEngine在每个框架中调用ObjectManagerDrawObjects()方法时绘制。

提问于
用户回答回答于

好的代码不是OOP的同义词。有时候,课堂是一种很好的工作工具。有时,它们只是把所有的事情都搞得乱七八糟,把最简单的代码片段。如果使用的是C++,则需要了解泛型编程。STL和Boost是如何利用通用编程编写代码来解决许多问题的很好的例子,这些问题都比等效的OOP代码更干净、更好、更高效。

在使用单例或DI时,许多依赖项都是不必要的。这两种工具都使得在不同模块之间传播依赖关系变得很好和容易,这就是您所要做的。然后你会得到一个设计,你的渲染器知道键盘输入,输入处理程序必须知道如何保存游戏。

DI的另一个可能的缺点是一个简单的技术问题。并非所有语言都有良好的DI库可用。有些语言使得编写健壮和通用的DI库几乎是不可能的。

用户回答回答于

不要将只有一个类的实例与单例模式混为一谈。在例子中,有一个管理各种事情的经理类是可以的。对于整个应用程序来说,只有一个实例也是非常酷的。但是课程使用管理器不应该依赖于一个全局对象的存在(不管它是通过类的静态变量还是被所有人访问的全局变量)。为了减轻这一点,在构造它们时,使它们需要对管理器对象的引用。他们都可以接收到同一个对象的引用,他们不会在意的。这有两个很好的副作用。首先,可以更好地测试您的类,因为您可以很容易地注入一个模拟管理器对象。第二个好处是,仍然可以使用多个管理器对象(例如,在多线程场景中),而不必更改客户端。

扫码关注云+社区