我在 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/