首页/开发/代码质量与评审速查/单例滥用与测试困境
设计原则与模式62 条

单例滥用与测试困境

单例把依赖藏进全局访问点:调用方看不出依赖、测试无法替换、并行测试互相污染;替代方案是显式注入共享实例(容器作用域单例),让依赖出现在签名里。

问题隐藏依赖 / 无法替换 / 测试污染
替代DI 容器注册单实例并注入
过渡依赖倒置:把单例藏到接口后面

改造方向

改造方向
// 之前:方法内部 Config.getInstance()
// 之后:构造函数注入 Config(容器保证唯一实例)
OrderService(Config config) { ... }

易错点

  • 为「方便」到处取单例:依赖图不可见,改动波及全库
  • 单例持有可变状态:测试顺序不同结果不同

数据来源与参考

  • Google Testing Blog(Singleton 与可测试性讨论);Michael Feathers 全局状态相关论述
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌