理解js中的单例模式


梦,给了我们自由
我们借助梦的共同语言,获得了无意识的神秘
认清了在清醒状况下弄不清的东西

单例模式是一种常见的设计模式,用于确保一个类只有一个实例,并提供一个全局访问点。

单例模式的关键是什么?

js中实现单例模式有很多种方法,但核心思想不变,是利用闭包和静态变量。
通过使用闭包,我们可以创建私有作用域,使得只有内部函数能够访问作用域中的变量和方法。
静态变量则用于存储单例实例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
const Singleon = (function() {
let instance; // 静态变量,用于存储单例实例
function createInstance() {
const obj = new Object("hello world!"); // 创建实例
return obj;
}

return {
getInstance: () => {
if (!instance) {
instance = createInstance();
}
return instance;
}
}
})();

const instance1 = Singleton.getInstance();
const instance2 = Singleton.getInstance();

console.log(instance1 === instance2); // 输出 true,表示两个实例是同一个对象

在上面的例子中,我们通过一个立即执行函数创建了一个闭包,将实例的创建逻辑封装在内部函数createInstance中。外部返回的对象包含一个公共方法getInstance,该方法用于获取单例实例。

在调用getInstance方法时,首先检查静态变量instance是否已经有值。如果没有,就调用createInstance方法创建一个实例,并将其赋值给instance。如果已经存在实例,就直接返回该实例。

这样,无论我们在代码中的哪个地方调用Singleton.getInstance(),都会获得同一个实例。

总结:
JavaScript单例模式是一种实现全局访问点和确保只有一个实例的常用设计模式。通过利用闭包和静态变量,我们可以创建单例并在需要时进行访问。单例模式在某些场景下非常有用,但也需要谨慎使用,以免造成代码耦合性和可测试性的问题。

全局状态管理:单例模式可用于创建一个全局状态管理对象,以便在应用程序的不同部分共享状态数据。例如,在React应用中,可以使用单例模式创建一个全局的Store对象,用于管理应用的状态。

日志记录器:单例模式可用于创建一个日志记录器对象,以确保在整个应用程序中只有一个日志记录器实例。这样,不同的模块和组件都可以通过该实例记录日志,方便调试和错误追踪。

缓存管理:单例模式可用于创建一个全局的缓存管理对象,用于存储和管理应用程序中的缓存数据。这样可以确保不同的模块和组件都可以访问相同的缓存数据,并避免重复创建缓存实例。

对话框/模态框:单例模式可用于创建一个全局的对话框或模态框管理器,以确保在应用程序中只有一个对话框实例存在。这样可以更方便地控制对话框的显示、隐藏和交互。

数据库连接池:在使用数据库的应用程序中,可以使用单例模式创建一个数据库连接池对象,以确保只有一个连接池实例,而不是每次需要数据库连接时都创建一个新的连接。

配置管理:单例模式可用于创建一个全局的配置管理对象,用于存储和管理应用程序的配置信息。这样不同的模块和组件可以方便地访问和使用配置数据。

我的微信公众号: 梨的前端小屋


文章作者: 梨啊梨
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 梨啊梨 !
  目录