知识卡片
用工厂方法模式替代单例模式
内容
单例的核心诉求只是”内存中只有一个实例”,也可用[[工厂方法模式的定义与命令简化原理]]实现 以规避[[单例模式的三个代价]]:目标类构造函数private,工厂类用反射在静态块创建唯一实例 并缓存,对外只提供获取方法。”是否单例”的决策移出业务类,恢复单一职责。发散:方案未堵死 其他类用反射强行创建新实例的风险,作者认为这属于项目规范而非技术问题。
参考来源
- 位置:《设计模式之禅(第2版)》第8章《工厂方法模式》(源文件:_epub-src/text/part0036.html)
- 结论依据:原文给出SingletonFactory通过Class.forName、getDeclaredConstructor、setAccessible(true)、newInstance在静态块中创建唯一实例并缓存的完整实现,说明"通过工厂方法模式创建了一个单例对象,该框架可以继续扩展……只要输入一个类型就可以获得唯一的一个实例"。
- 原始内容:Singleton保证不能通过正常的渠道建立一个对象,那SingletonFactory如何建立一个单例对象呢?答案是通过反射方式创建……通过获得类构造器,然后设置访问权限,生成一个对象,然后提供外部访问,保证内存中的对象唯一。