单例模式的性能缺陷

2 design-patterns

我在我的游戏中实现了单例模式来访问instance函数和变量,就像它们一样static。一切都很好,我可以方便地使用它。然而,据我所知,一切都是有代价的,这种易用性肯定有某种缺点。问题是,GameManager.instance.someOtherClass.someVariable例如经常使用是不是很多费用?一般来说,性能友好度如何Singleton

Jan*_*nis 5

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

使用单例模式意味着耦合到实现类(而不是接口或抽象)。使用 GameManager 的每个组件最好使用 GameManagerInterface 代替,以便可以轻松更改或扩展实现。隐藏对具体单例类的依赖很困难,因为你必须在某个地方调用静态方法。

...
IGameManager iGameManager = GameManager.getInstance();
...
Run Code Online (Sandbox Code Playgroud)

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

 GameManager.instance.someOtherClass.someVariable     
Run Code Online (Sandbox Code Playgroud)

......从来都不是一个好主意。这样做会将调用类耦合到每个被调用类的实现。最好只与您的直接邻居交流,如“德米特法则”(又名“告诉不要问”或“不要与陌生人交谈”)中所述。

也许是时候考虑单例模式的目的了:单例模式用于确保一个类只有一个实例。而已。

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