[Javascript] Singleton Pattern
Source: https://javascriptpatterns.vercel.app/patterns/design-patterns/singleton-pattern
With the Singleton Pattern, we restrict the instantiation of certain classes to one single instance. This single instance is unmodifiable, and can be accessed globally throughout the application.
Create a Singleton in Javascritp:
Class:
let instance;
// 1. Creating the `Counter` class, which contains a `constructor`, `getInstance`, `getCount`, `increment` and `decrement` method.
// Within the constructor, we check to make sure the class hasn't already been instantiated.
class Counter {
constructor() {
if (instance) {
throw new Error("You can only create one instance!");
}
this.counter = counter;
instance = this;
}
getCount() {
return this.counter;
}
increment() {
return ++this.counter;
}
decrement() {
return --this.counter;
}
}
// 2. Setting a variable equal to the the frozen newly instantiated object, by using the built-in `Object.freeze` method.
// This ensures that the newly created instance is not modifiable.
const singletonCounter = Object.freeze(new Counter());
// 3. Exporting the variable as the `default` value within the file to make it globally accessible.
export default singletonCounter;
2 points:
- If there is an instance already, we want to throw error.
- Use Object.freeze function to make it unmodifiable.
Object:
let counter = 0;
export default Object.freeze({
getCount: () => counter,
increment: () => ++counter,
decrement: () => --counter,
})
Be carefully about using Singelton:
Depedency Hiding: When importing another module, it may not always be obvious that that module is importing a Singleton. This could lead to unexpected value modification within the Singleton, which would be reflected throughout the application.
Let's say Counter is a singelton. module A and B both import counter and call `increment` twice in each modules.
If in Moulde A, we import Module B. Then `increment` will be called 4 times. But in Module A, we only call twice, that might cause confusion when you just looking at Module A code.
Unnecessary: ES2015 Modules are singletons by default. We no longer need to explicitly create singletons to achieve this global, non-modifiable behavior.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2021-08-26 [CSS 3] Solved: DOM element which is visible but not clickable: pointer-events
2021-08-26 [Cloud Architect] 2. Resiliency
2020-08-26 [Machine Learning] Cost Function for Logistic Regression Model
2018-08-26 [Typescript Kaop-ts] Use AOP in Vue Components with TypeScript and Kaop-ts
2015-08-26 [React] React Fundamentals: JSX Deep Dive
2015-08-26 [React] React Fundamentals: Build a JSX Live Compiler