单例和其他设计问题



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

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

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

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

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

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

几乎没有充分的理由进行后一种限制。如果您只想使用该类的一个实例,那么只需创建其中一个实例即可。您不必编写一个特殊的类来告诉自己只创建其中一个。

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

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

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

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

最新更新