单身人士和其他设计问题

时间:2013-10-21 09:43:23

标签: java c++ actionscript-3 oop design-patterns

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

在Java和C ++中,我还遇到了需要使用其他classe成员或在不同类中调用其函数的情况。

问题是,是否有更好或另一种设计,让其他课程互相交流而不使用单身人士?我觉得构图是答案,但我需要更详细的解决方案或设计建议。

1 个答案:

答案 0 :(得分:3)

Singleton模式错误地混淆了两个问题(或者我应该说,它的大多数或所有观察到的用途都是这样):

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

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

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

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

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

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

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