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

用闭包封装私有变量和私有方法来实现单例模式,核心是把实例变量和构造逻辑藏在函数作用域里,只暴露一个获取实例的统一入口。这样既保证全局唯一,又防止外部直接修改内部状态。
用 IIFE 创建封闭作用域
立即执行函数(IIFE)是最常用的方式,它运行一次就生成一个独立作用域,里面的变量对外不可见。
- 在 IIFE 内部声明一个 let instance = null,作为私有缓存变量
- 定义私有构造函数或工厂函数(比如 createInstance()),里面可包含私有方法和初始化逻辑
- 返回一个对象,仅提供 getInstance() 方法作为唯一出口
确保实例只创建一次
getInstance 方法要检查私有变量是否已存在,不存在才调用构造逻辑并赋值,否则直接返回已有引用。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 第一次调用时执行构造逻辑,后续调用跳过创建步骤
- 因为 instance 被闭包持有,外部无法篡改或重置,天然具备封装性
- 所有通过 getInstance 获取的对象,都指向内存中同一个实例
支持参数但保持一致性
如果单例需要初始配置,可以在 getInstance 中接收参数,但必须约定:只以首次调用为准。
立即学习“Java免费学习笔记(深入)”;
- 首次传参用于初始化,后续调用即使传参也忽略(或抛出提示)
- 避免在 createInstance 中做副作用强的操作(如发起请求、操作 DOM),除非你确认它只发生一次
- 若需动态配置,建议改用“工厂 + 缓存”策略,而非强行扩展单例语义
与类结合提升可读性
ES6+ 环境下,可以把类作为构造器,放进闭包里,兼顾面向对象写法和闭包封装优势。
- 定义 class,包含公有方法和可能的私有字段(#field)
- IIFE 内部用 new 实例化该类,并缓存到私有变量中
- getInstance 返回这个实例,使用者仍能调用类的方法,但无法访问闭包内的 instance 变量

















