Skip to content
目录

单例模式

参考:单例模式 | 代码酷

是什么

单例模式(Singleton Pattern)保证某个类(或模块)在进程内只有一个实例,并提供统一访问点。适合配置、日志、客户端实例等「全局一份」的资源。

在 React 里要谨慎:很多「全局状态」更适合 Context、状态库或模块级常量,单例过多会拖累测试与 SSR(共享可变状态)。

特点

  • 唯一实例、全局访问点。
  • 常见懒创建:第一次使用时再初始化。

ES 类实现

ts
class ConfigManager {
  private static instance: ConfigManager | undefined;
  config = { apiUrl: 'https://api.example.com', theme: 'dark' as const };

  private constructor() {}

  static getInstance(): ConfigManager {
    if (!ConfigManager.instance) {
      ConfigManager.instance = new ConfigManager();
    }
    return ConfigManager.instance;
  }

  getConfig() {
    return this.config;
  }
}

constructor 设为 private,避免外部 new,比「在 constructor 里 return 旧实例」更符合 TypeScript 习惯。

模块模式(闭包)

ts
const createSingleton = () => {
  let instance: { id: number } | undefined;
  return {
    getInstance() {
      if (!instance) instance = { id: Math.random() };
      return instance;
    },
  };
};

在 React 中

  • 只读配置、埋点客户端等可用模块单例。
  • 可变全局状态优先 Context / 外部 store,便于按树隔离与 mock。

缺点

隐藏依赖、单测需 reset 或注入替身;并发与 SSR 下「一个进程一个实例」未必等于「一个用户一个实例」。

MIT License.