单例模式
参考:单例模式 | 代码酷
是什么
单例模式(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 下「一个进程一个实例」未必等于「一个用户一个实例」。