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