工厂模式按需创建同类对象,单例模式确保全局唯一实例;二者分别解决“种类”与“数量”问题,组合使用可降低内存占用、提升初始化效率并增强可维护性。

用工厂模式和单例模式减少重复对象创建,核心在于:**按需生成、统一管控、避免冗余实例**。不是所有对象都该每次 new 一次,尤其当对象开销大(如配置管理器、日志器、API 客户端)或逻辑复杂(如多类型 UI 组件、用户角色)时,这两种模式能显著降低内存占用、提升初始化效率,并让代码更易维护。
工厂模式:把“怎么造”收口到一个地方
适合场景:需要根据条件动态创建不同但同类的对象(比如按钮、表单验证器、消息提示类型),且创建过程含逻辑判断或依赖注入。
- 用函数或类封装创建逻辑,使用者只传参数,不关心内部 new 了谁
- 避免在业务代码里散落一堆 if-else + new,后续新增类型只需改工厂,不碰调用方
- 示例中 ButtonFactory 根据 type 返回 PrimaryButton 或 SecondaryButton,调用方无需 import 多个类,也不用自己写 switch
单例模式:确保全局唯一,复用已有实例
适合场景:对象本身无状态变化、资源昂贵、需跨模块共享(如数据库连接池、全局配置、Logger、主题管理器)。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 首次调用 getInstance 时创建,之后始终返回同一引用,彻底杜绝重复 new
- JavaScript 中常用闭包变量或静态属性(如 Logger.instance)来保存唯一实例
- 注意:单例不是万能的——若对象需携带用户上下文或有独立生命周期,强行单例反而引发状态污染
组合使用效果更佳
实际项目中常二者配合:用工厂生产对象,再由单例保障关键服务的唯一性。
- 比如 API 客户端:用 Factory 创建不同环境(dev/test/prod)的 client 实例,每个环境内 client 自身用单例保证只有一份
- 又如权限校验器:Factory 根据用户角色返回 RoleChecker 实例,而底层 TokenService 用单例统一管理 token 刷新逻辑
- 关键点:工厂管“种类”,单例管“数量”,分工明确不重叠
避开常见误区
不是所有对象都适合套模式,滥用反而增加复杂度。
- 普通数据对象(如 { name: 'xxx', id: 1 })没必要工厂化,字面量更轻量
- 单例不能替代状态管理——它不解决响应式更新,只是确保实例唯一
- 工厂返回的对象若本身含可变状态,要注意是否需深拷贝或重置,否则多个使用者可能互相干扰
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










