Java 单例和其他设计问题

Java 单例和其他设计问题,java,c++,actionscript-3,oop,design-patterns,Java,C++,Actionscript 3,Oop,Design Patterns,我使用过不同的语言,比如C++/Java,目前使用的是AS3。大多数应用是计算机视觉和小型2D电脑游戏。我工作过的大多数公司都使用AS3之类的语言中的单例来轻松检索元素或类。他们的问题基本上是他们需要一些变量或者从其他类调用其他函数。在像AS3这样的语言中,没有私有构造函数,他们编写了一个黑客代码来防止出现新实例 在爪哇和C++中,我也面临着需要使用其他类成员或在不同的类中调用它们的函数的情况。p> 问题是,有没有更好的设计,让其他类在不使用单例的情况下彼此交互?我觉得组成就是答案,但我需要更详

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

在爪哇和C++中,我也面临着需要使用其他类成员或在不同的类中调用它们的函数的情况。p>
问题是,有没有更好的设计,让其他类在不使用单例的情况下彼此交互?我觉得组成就是答案,但我需要更详细的解决方案或设计建议

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

  • 您需要一个全局变量
  • 您希望将程序中存在的给定类的实例数限制为1
可变的全局状态使您的程序更难推理。但是,好吧,有时候这是你想要的,你可以做到,但不要太骄傲。根据语言的不同,您可能需要使用一些愚蠢的技巧来隔离依赖于全局状态的单元,以便进行测试

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

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

如果您希望类中的每个实例都表现相同,则考虑“BoG模式”:编写一个类,其实例没有自己的状态,而是每个实例在全局状态下运行。 即使您决定确实需要其类型唯一的对象,您仍然应该正确评估全局访问它是否合适,或者它是否应该是使用它的组件的注入依赖项


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

单例模式错误地将两个问题合并在一起(或者我应该说,大多数或所有观察到的使用都是这样):

  • 您需要一个全局变量
  • 您希望将程序中存在的给定类的实例数限制为1
可变的全局状态使您的程序更难推理。但是,好吧,有时候这是你想要的,你可以做到,但不要太骄傲。根据语言的不同,您可能需要使用一些愚蠢的技巧来隔离依赖于全局状态的单元,以便进行测试

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

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

如果您希望类中的每个实例都表现相同,则考虑“BoG模式”:编写一个类,其实例没有自己的状态,而是每个实例在全局状态下运行。 即使您决定确实需要其类型唯一的对象,您仍然应该正确评估全局访问它是否合适,或者它是否应该是使用它的组件的注入依赖项


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

单例模式错误地将两个问题合并在一起(或者我应该说,大多数或所有观察到的使用都是这样):

  • 您需要一个全局变量
  • 您希望将程序中存在的给定类的实例数限制为1
可变的全局状态使您的程序更难推理。但是,好吧,有时候这是你想要的,你可以做到,但不要太骄傲。根据语言的不同,您可能需要使用一些愚蠢的技巧来隔离依赖于全局状态的单元,以便进行测试

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

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

如果您希望类中的每个实例都表现相同,则考虑“BoG模式”:编写一个类,其实例没有自己的状态,而是每个实例在全局状态下运行。 即使您决定确实需要其类型唯一的对象,您仍然应该正确评估全局访问它是否合适,或者它是否应该是使用它的组件的注入依赖项

关于我能想到的唯一特殊情况是,ha