单例模式通过闭包封装私有变量和方法实现,利用iife创建独立作用域,内部缓存instance并提供getinstance唯一入口,确保全局唯一且不可篡改;支持首次参数初始化,推荐结合es6类提升可读性。

用闭包封装私有变量和私有方法来实现单例模式,核心是把实例变量和构造逻辑藏在函数作用域里,只暴露一个获取实例的统一入口。这样既保证全局唯一,又防止外部直接修改内部状态。
用 IIFE 创建封闭作用域
立即执行函数(IIFE)是最常用的方式,它运行一次就生成一个独立作用域,里面的变量对外不可见。
- 在 IIFE 内部声明一个 let instance = null,作为私有缓存变量
- 定义私有构造函数或工厂函数(比如 createInstance()),里面可包含私有方法和初始化逻辑
- 返回一个对象,仅提供 getInstance() 方法作为唯一出口
确保实例只创建一次
getInstance 方法要检查私有变量是否已存在,不存在才调用构造逻辑并赋值,否则直接返回已有引用。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 第一次调用时执行构造逻辑,后续调用跳过创建步骤
- 因为 instance 被闭包持有,外部无法篡改或重置,天然具备封装性
- 所有通过 getInstance 获取的对象,都指向内存中同一个实例
支持参数但保持一致性
如果单例需要初始配置,可以在 getInstance 中接收参数,但必须约定:只以首次调用为准。
- 首次传参用于初始化,后续调用即使传参也忽略(或抛出提示)
- 避免在 createInstance 中做副作用强的操作(如发起请求、操作 DOM),除非你确认它只发生一次
- 若需动态配置,建议改用“工厂 + 缓存”策略,而非强行扩展单例语义
与类结合提升可读性
ES6+ 环境下,可以把类作为构造器,放进闭包里,兼顾面向对象写法和闭包封装优势。
- 定义 class,包含公有方法和可能的私有字段(#field)
- IIFE 内部用 new 实例化该类,并缓存到私有变量中
- getInstance 返回这个实例,使用者仍能调用类的方法,但无法访问闭包内的 instance 变量
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










