单例模式(面试版)
一、面试常考点
1. 单例模式定义
确保某类在系统中只有一个实例,并提供全局访问点。
2. 为什么需要
避免重复创建高成本对象,保证全局状态一致。
3. 面试追问点
如何防止重复实例、模块化环境下为什么天然偏单例。
二、细节介绍
1. 核心要素
唯一实例、全局可访问、实例创建受控。
2. 常见实现
类静态方法、闭包、ES Module 导出实例。
3. 注意事项
单例不是“全局变量替代品”,过度使用会增加隐式耦合与测试难度。
三、示例代码
class Logger {
static instance = null
constructor() {
this.logs = []
}
static getInstance() {
if (!Logger.instance) {
Logger.instance = new Logger()
}
return Logger.instance
}
info(message) {
this.logs.push({ level: 'info', message, time: Date.now() })
}
}
const loggerA = Logger.getInstance()
const loggerB = Logger.getInstance()
console.log(loggerA === loggerB) // true
四、常用应用场景
1. 全局配置中心
运行时配置读取与缓存。
2. 全局弹窗/消息系统
确保通知容器唯一,避免重复挂载。
3. 日志与监控客户端
统一埋点、统一上报、统一采样策略。
五、高频追问标准答法(Q/A)
1. Q: 单例和全局变量有什么区别
A: 单例强调受控创建和统一访问接口;全局变量通常缺乏封装和生命周期管理。
2. Q: 单例模式最大风险是什么
A: 隐式共享状态过多,导致模块耦合和测试困难。
3. Q: 前端里哪些对象天然接近单例
A: 全局配置、埋点 SDK、全局消息容器、应用级状态管理实例。