【发布时间】:2015-11-22 21:23:51
【问题描述】:
几年来,我一直在与我的公司开发一款游戏。不过最近我们一直在改进我们的游戏的基础系统,以使未来的添加更容易。我们所做的一项更改是添加资源管理器,而不是在我们的屏幕类中手动加载信息,这些信息本质上是游戏状态。我们决定将其实现为一个singleton。然而,我知道在编程社区中使用单例的争议。 下面我将举例说明我们如何使用我们的字体管理器。我想知道在这种情况下单例是否可以接受,或者您是否会推荐其他方法。
mTextToBeDrawn.setFont(FontManager::GetInstance()->GetFont("Default"));
我愿意接受所有建议,我将解释当前的OOP 设计,以便更深入地了解系统。每个 Manager 都从一个名为 Manager 的基类扩展而来,带有通用的 Add 和 Remove 方法。然后在派生类中实现添加和删除方法。这些类只需要一个实例,因为游戏只需要一个状态管理器、字体管理器等。那么我应该使用单例还是应该使用其他方法来创建更好的代码。
【问题讨论】:
-
这看起来非常主观。您对这种方法是否有任何问题,或者您的担忧是基于单身人士的坏名声?
-
我个人理解单身人士的问题我很了解人们的意见。然而,这并不重要。我只是想知道是否有更好的方法,或者这种情况下的单例是否是最好的解决方案。
-
关于单例的潜在陷阱之一是除了显而易见的问题之外,它们是全局变量,它们以相当不可预测的顺序创建和销毁。如果你只有一两个,那部分还不错,如果你有几十个可能相互依赖的部分,它可能会变得非常糟糕(例如,销毁一个单例可能会尝试访问另一个已经被销毁的单例)。因此,它有助于整合整个应用程序,并且可能有一个单例,因为这可以聚合所有这些“管理器”并以明确定义的顺序创建/销毁它们。
-
还有那种“合并的应用程序单例”,你只需为整个应用程序提供一个单例,如果你改变主意并决定应该多次实例化它,那就容易多了管理而不是一大堆单例(如果您在这里改变主意,仍然很痛苦并且涉及级联界面更改,但更新函数涉及传递这个应用程序对象并不难)。