0

我曾使用过不同的语言,如 C++/Java 和目前的 AS3。大多数应用是计算机视觉和小型 2D 计算机游戏。我工作过的大多数公司,他们使用像 AS3 这样的语言中的 Singletons,以一种简单的方式检索元素或类。他们的问题基本上是他们需要一些变量或从其他类调用其他函数。在像 AS3 这样的语言中,没有私有构造函数,他们编写了一个 hacky 代码来防止新实例。

在 Java 和 C++ 中,我还面临需要使用其他类的成员或在不同类中调用它们的函数的情况。

问题是,是否有更好的设计,让其他类在不使用单例的情况下相互交互?我觉得组合就是答案,但我需要更详细的解决方案或设计建议。

4

1 回答 1

3

单例模式错误地将两个问题混为一谈(或者我应该说,大多数或所有观察到的使用它都是如此):

  • 你想要一个全局变量
  • 您希望将程序中存在的给定类的实例数限制为 1。

可变的全局状态使您的程序更难推理。但是,好吧,有时这就是你想要的,你可以做到,但不要为此感到骄傲。根据语言,您可能需要使用一些愚蠢的技巧来隔离依赖于全局状态的单元以用于测试目的。

几乎没有充分的理由做出后一种限制。如果您只想使用该类的一个实例,很好,只创建一个。您不必编写一个特殊的类来告诉自己只创建一个。

所以:如果你想要一个类的全局实例,就像你想要一个 Singleton 一样创建一个,除了不要试图阻止创建其他实例。

如果您希望该类的每个实例都具有相同的行为,请考虑“Borg 模式”:编写一个其实例没有自己的状态的类,而是每个实例都在全局状态上运行。

即使您决定确实需要一个其类型唯一的对象,您仍然应该正确评估全局访问它是否合适,或者它是否应该是使用它的那些组件的注入依赖项。

关于我能想到的唯一特殊情况是,对语言具有特殊含义的值的类型可以合法地是单例,以便在实现中允许特殊技巧。因此,例如None在 Python 中是一个单例,其类型为NoneType. 我想在所有这些情况下,类型都是不可变的。

于 2013-10-21T09:51:26.783 回答