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