返回首页

单例模式(面试版)

一、面试常考点

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、全局消息容器、应用级状态管理实例。