Singleton是平常coding过程经常使用的设计模式,最近在一次面试中被问到何时该使用singleton,居然从来没仔细思考过这个问题,查阅了各种资料后,来做个总结
Singleton一般是被喷的,各种缺点:
Hides dependencies: 使用Singleton不用通过dependency injection注入,在API中看不出对Singleton的依赖。
Hard to test: 使用singleton的类没法测试,因为singleton的类没法mock
Hard to subclass: 构造函数私有,无法继承
Singleton是per classloader的,而不是per vm的,其实会产生多个实例
Global state,难以维护
所以singleton应该尽量避免,而应该在系统最顶层构造一个单一的对象(可以是工厂也可以直接new),然后通过依赖注入,注入到每个使用的类中。
有一种例外情况使用singleton也无妨的,就是logging,因为logging的状态流动是从application流动到logging singleton里的,logging的global状态变化不会影响到外部的application。
Singleton还有的一个好处,可能就是延迟初始化了