我和我的公司一起开发了几年的游戏。然而,最近我们一直在改进游戏的基础系统,以便日后添加更容易。我们所做的一项更改是添加资源管理器,而不是手动加载我们的Screen类中的信息,这些信息基本上是游戏状态。我们决定将其作为单身人士来实施。然而,我知道在编程社区中使用单身人士的争议。 我将举例说明我们如何使用字体管理器下来。我想知道在这种情况下单身是否可以接受,或者你是否会推荐其他方法。
mTextToBeDrawn.setFont(FontManager::GetInstance()->GetFont("Default"));
我对所有建议持开放态度,我将解释当前的 OOP设计,以便更深入地了解系统。每个Manager都使用通用的“添加和删除方法”从名为Manager的基类扩展。然后,在派生类中实现添加和删除方法。这些类只需要一个实例,因为游戏只需要一个状态管理器,字体管理器等等。我应该使用单身,还是应该使用其他方法来创建更好的代码。
答案 0 :(得分:3)
通常在编程社区中我们听到“使用X是坏的”或“使用X是好的”,但只是将某些内容标记为坏或好并不能解释其优点和缺点或某些内容可能存在问题或者如何正确使用它。如果你不明白为什么可能会有什么不好的话,当你以其他形式或不同的名字爬行时,你很可能不会注意到它。
在你的单身人士的例子中,我会做一些研究,以找出使用单身人士的批评和陷阱,并评估他们是否会成为你的问题。
对我来说最大的两个问题是:
单身人士介绍全球数据和全球状态。
使用全局数据,可以在整个代码中进行访问和修改,这使得难以跟踪错误,并且可以更容易地进入混乱的状态。单身经常是设计不佳的结果。
单身人士通常不是线程安全的。
在某些应用程序中,陷阱并不会成为问题。在Cocoa / Objective-C世界中,Apple偶尔会使用Singletons来解决我认为完全适合这项工作的问题。它们的一些用法与您描述的类似,例如图像管理/缓存。
您可以在此处阅读更多内容What is so bad about singletons?