class - 项目中有太多的单例 - 这是一种不好的做法吗?

标签 class design-patterns architecture singleton anti-patterns

在几乎每个项目中,我都创建了一些实现单例模式的类。例如,数据管理器——如果有一些文件系统、数据加载器的工作——如果应用程序连接到互联网、不同的资源管理器等。有时有多达 5-7 个这样的类,我开始觉得我在做有事吗。过多地使用单例模式是一种不好的做法吗?

最佳答案

单例不一定是问题——拥有一个在其领域内是专家的单个对象可能非常有用——但将单例性明确编码到对象中几乎总是一个坏主意(而且经常做得很糟糕)。事实证明,最好将应用程序的配置——包括决定哪些类具有单例实例化——留给专门从事该工作的单独层,例如 Java 的 Spring。像那样,管理层可以管理什么是单例,什么是特定上下文中的单例(例如,在 session 范围内)以及什么总是需要重新制造。这让您可以自由地专注于编写业务逻辑。

有关为什么单例可能会出现问题以及为什么它们应该通过管理/配置成为单例的示例,请考虑管理与数据库的连接的类。您可能会说单例的经典案例。您也是对的,直到您发现您的应用程序已经发展到必须将连接集成到两个数据库的地步(它发生了!)然后您必须理清整个混​​乱局面。如果你的代码不知道它是否正在处理单例,那么你很有可能通过重新配置来处理这一切;一些类将连接到一个数据库,一些类连接到另一个数据库,但他们会毫不费力地继续使用它。 (任何两者都需要的东西……嗯,这就是我说“极好的机会”的原因。)

当您为代码编写测试时,另一个说明为什么单例会成为问题的例子出现了。 (您确实编写了测试,是吗?)显式单例很难测试,因为它们很难配置且很难隔离。你不能在两次测试之间正确地拆除它们,因为这意味着有很多。如果您的应用程序仅通过配置使用单例,则测试配置可以轻松更改它,并且您可以更轻松地进行测试。

关于class - 项目中有太多的单例 - 这是一种不好的做法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8440803/

相关文章:

java - ActionPerformed 方法不适用于另一个类

javascript - React.js 的 Falcor 是什么?

javascript - 在 React/Redux 中管理兄弟组件之间的滚动状态

c++ - 将两个选项之间的参数传递给一个类

c++ - 另一个类中的自定义类实例数组崩溃编译器

c# - 仓库模式和工厂模式的区别

javascript - 在创建单例实例时传递选项的 TypeScript 模式

database - 如何在微服务上管理多个数据库?

python - 在 python 应用程序中存储类实例的正确方法

c - 通过 extern 使用全局变量时两害相权取其轻