其他
需要全局唯一共享实例时使用 Singleton…
当应用需要恰好一个类实例来协调全局状态、配置或共享资源时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15
适用场景
需要全局唯一共享实例时使用 Single通用
解决思路
- 创建变量 instance,用于保存唯一实例的引用。
- 在 Counter 的 constructor 中检查 instance 是否已有值;如果已有值,说明实例已存在,抛出 Error("You can only create one instance!") 阻止再次实例化。
- 如果 instance 尚无值,在 constructor 中将 instance 设为 this,保存当前创建的唯一实例。
- 实现 Counter 类:getInstance 方法返回 this;getCount 方法返回当前 counter 值;increment 方法将 counter 加一;decrement 方法将 counter 减一。
- 导出单例前用 Object.freeze() 冻结实例,例如 const singletonCounter = Object.freeze(new Counter()); export default singletonCounter;,防止使用方添加或修改属性。
- 在 JavaScript 中,如果能满足需求,优先使用简单对象字面量或模块,而不是基于 class 的 Singleton。
- 在 React 中,全局状态优先使用状态管理工具(如 Redux 或 React Context),而不是 Singleton。
- 如果测试依赖 Singleton,测试后重置整个实例,因为不能每次创建新实例,测试会依赖前一个测试对全局实例的修改且测试顺序会影响结果。
- 将单例从 counter.js 模块默认导出,让 redButton.js、blueButton.js 等模块导入同一实例;在任一模块调用 increment 后,counter 值在所有这些模块中共享更新。
- 如果改用普通对象实现,创建包含 count 属性、increment 方法(将 count 加一)、decrement 方法(将 count 减一)的 counter 对象;由于对象按引用传递,各模块导入的是同一个 counter 对象引用,修改 count 会在所有导入方可见。
- 使用 Redux 时,组件通过 dispatcher 发送 action,且只能由纯函数 reducers 更新状态,组件不能直接更新状态。
适用边界 · 注意事项
- 在 JavaScript 中通常应避免 Singleton(被认为是 anti-pattern);需要多个类实例时尤其不要使用,因为它按设计强制只有一个共享实例。
- 当它引入隐藏的全局状态耦合、使测试和代码推理更困难时不要使用。
- 当依赖注入或模块作用域变量能以更好可测试性达到同样结果时不要使用。