单身模式性能缺陷

时间:2017-01-28 08:45:21

标签: design-patterns

我在游戏中实现了 Singleton模式来访问instance函数和变量static。一切都很好,我可以方便地使用它。但是,根据我的理解,一切都有成本,这种易用性必然会有一些缺点。问题是,经常使用GameManager.instance.someOtherClass.someVariable是否需要花费很多费用?一般来说,Singleton的性能如何?

4 个答案:

答案 0 :(得分:3)

设计大型软件系统的一个重要部分是最小化组件和类之间的耦合。这可以通过封装不同组件的实现来完成。彼此了解的组件越多,它们之间的依赖性就越高。

使用Singleton Pattern意味着耦合到实现类(不是接口或抽象)。使用GameManager的每个组件都会使用GameManagerInterface,这样可以更容易地更改或扩展实现。将依赖关系隐藏到具体的Singleton类是很困难的,因为你必须调用静态方法。

...
IGameManager iGameManager = GameManager.getInstance();
...

使用像这样的单例模式是......:

 GameManager.instance.someOtherClass.someVariable     

......永远不是一个好主意。这样做会将调用类耦合到每个被调用类的实现。如“德米特定律”所述,最好只与你的直接邻居沟通 (a.k.a.“告诉不要问”,或“不要跟陌生人说话”)。

也许你是时候考虑Singleton模式的目的了:Singleton模式用于确保只有一个Class的实例。没什么。

在代码中的每个地方使用静态“getInstance”方法会导致隐藏的依赖关系,如前所述。你正在做的是使用Singleton模式作为全局变量的替代。这会使您的系统变得脆弱,因为您的代码的每一部分都依赖于单例类的实现。更改此类可能会导致整个系统崩溃。

答案 1 :(得分:2)

如果经常使用Singleton模式,则不存在性能缺陷。从这个角度来看,使用它你喜欢多少次。 但是,如果你经常需要这个变量,你应该考虑重新设计。 如果需要全局变量,请不要使用单例。单身人士只有一个原因:“不允许有一个以上的班级实例。”

所以要小心这个模式。 Janis在他的answer中很好地解释了这个问题。

答案 2 :(得分:0)

通常,Java应该能够优化那些经常使用的访问。在你真正完成游戏并开始进行性能调整的同时测量影响时,我认为性能影响并不重要。

当您想要使用多个实例时,可能会出现更严重的问题,那么您将不得不改变您的架构。我一般不是单身人士的朋友,如果我100%确定我不可能需要第二个班级,我只会使用它们。

答案 3 :(得分:0)

答案很简单,衡量单身和非单身方法。在单例中,在非单例中创建新对象一次在每次调用时创建新对象。