我使用过不同的语言,比如C ++ / Java和AS3。大多数应用程序是计算机视觉和小型2D计算机游戏。我工作的大多数公司,他们使用像AS3这样的语言的单身人士,以简单的方式检索元素或类。他们的问题基本上是他们需要一些变量或从其他类调用其他函数。在像AS3这样的语言中,没有私有构造函数,他们编写了一个hacky代码来防止新实例。
在Java和C ++中,我还遇到了需要使用其他classe成员或在不同类中调用其函数的情况。
问题是,是否有更好或另一种设计,让其他课程互相交流而不使用单身人士?我觉得构图是答案,但我需要更详细的解决方案或设计建议。
答案 0 :(得分:3)
Singleton模式错误地混淆了两个问题(或者我应该说,它的大多数或所有观察到的用途都是这样):
可变的全球状态使您的程序更难以推理。但是,好的,有时它就是你想要的,你可以做到,但不要为此感到骄傲。根据语言的不同,您可能需要采用一些愚蠢的技巧来隔离测试目的,这些单元依赖于全局状态。
几乎没有理由做出后一种限制。如果您只想使用该类的一个实例,那么只需创建其中一个实例。你不必写一个特殊的类来告诉自己只创建其中一个。
所以:如果你想要一个类的全局实例创建一个类似于Singleton,除了不要试图阻止创建其他实例。
如果您希望类的每个实例都表现相同,那么请考虑“Borg模式”:编写一个实例没有自己状态的类,而是每个实例都在全局状态下运行。
即使你决定确实需要一个与其类型唯一的对象,你仍然应该正确评估是否适合全局访问它,或者它是否应该是这些组件的注入依赖项用它。
关于我能想到的唯一特殊情况是,对语言有特殊意义的值的类型可以合法地为单例,以便在实现中允许特殊的技巧。例如,Python中的None
是一个类型为NoneType
的单例。我想在所有这些情况下,类型都是不可变的。