java - 为什么在 Java 代码中实现单例模式(有时)被认为是 Java 世界中的反模式?

标签 java design-patterns singleton

我在 SO 中看到有人评论说单例模式是一种反模式。我想知道为什么?

最佳答案

测试

一个原因是单例不容易处理单元测试。您无法控制实例化,并且就其本质而言,它们可能会在调用之间保留状态。

因此,dependency injection 的原则很受欢迎。每个类都被注入(inject)(配置)了它们需要运行的类(而不是通过单例访问器派生),因此测试可以控制要使用哪些依赖类实例(并在需要时提供模拟)。

诸如Spring之类的框架会控制其对象的生命周期并经常创建单例,但这些对象是由框架注入(inject)到它们的依赖对象中的。因此,代码库本身不会将对象视为单例。

例如而不是这个(例如)

public class Portfolio {
   private Calculator calc = Calculator.getCalculator();
}

你会注入(inject)计算器:

public class Portfolio {
   public Portfolio(Calculator c) {
      this.calc = c;
   }
}

因此,Portfolio 对象不知道/关心存在多少 Calculator 实例。测试可以注入(inject)一个虚拟的 Calculator 来简化测试。

并发

通过将自己限制在一个对象的一个​​实例上,线程的选项是有限的。可能必须保护对单例对象的访问(例如,通过同步)。如果您可以维护这些对象的多个实例,那么您可以根据正在运行的线程调整实例数量,并增加代码库的并发能力。

关于java - 为什么在 Java 代码中实现单例模式(有时)被认为是 Java 世界中的反模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11292109/

相关文章:

Java 程序在扫描仪可以第二次接受输入之前关闭

python - 允许将一个类附加到另一个类的设计模式

Objective-C - iOS - 类方法行为不正常

c++ - 如果允许堆栈分配的引用作为参数,如何进行通信?

Java - 我应该使用字段还是类来解决问题,如下所示 :

java - Spring注入(inject)静态(全局)单例

java - 从单例类返回的对象引用是线程安全的吗?

java - 使用GSON解析JSON数组和对象

java - 使用 HTTPClient 4 监控下载进度?

java - eclipse maven 循环占位符引用错误使用配置文件