概述
单例模式(Singleton Pattern),保证一个类仅有一个实例,并且提供一个访问它的全局访问点。并不是说只能new一个对象出来,而是针对某个特殊的对象,我们第一次将它实例化以后,访问的一直都是之前实例化好的特殊对象。
-
重点
- 一个类只能有一个实例对象
- 提供一个全局节点获取这个实例
-
在前端应用中,符合上述要求的,又有哪些应用
- 全局的window和document
- Vuex、Pinia、Router
-
为什么要使用单例模式?
整个应用中只有一个实例存在,这个实例需要被全局访问,并且希望能够节省内存、有一个统一处理资源和优化的对象,这个时候单例模式是一个很好的选择。
-
使用单例模式的好处
请求接口的过程中,对象只需要一个即可,如果创建多个实例会带来资源耗费严重,或者访问路径不一致等情况。
单例模式的实现
单例模式是一种设计模式,用于初始化以后提供一个全局访问点来访问该实例。以下是几种实现单例模式的常见方法
饿汉式
饿汉模式就是提前给实例创建好了对象
优点:写法简单,类加载的时候就完成了初始化,理论上线程是安全的
缺点:因为创建好了对象,使用与否都会占着内存
推荐:实例化过程很快且确定会用到的情况
class Singleton {
// 创建好实例
public static instance = new Singleton();
// 获取实例
public static getInstance() {
return Singleton.instance;
}
}
懒汉式
懒汉模式就是在需要的时候才会去创建对象
优点:性能更高
缺点:考虑多线程的同步问题
推荐:实例化过程比较耗时或耗资源的情况
class Singleton {
// 创建好实例
private static instance: Singleton;
// 如果有两个线程A和B,它们同时调用 getInstance 方法,并且实例还没有被初始化,那么它们会同时执行 Singleton.instance = new Singleton(); 这行代码。这样就会导致实际创建了两个实例,违反了单例模式的初衷
public static getInstance(): Singleton {
// 不存在时才实例化对象
if (!Singleton.instance) Singleton.instance = new Singleton();
return Singleton.instance;
}
}
优缺点
单例模式作为一种设计模式,具有明确的目的、简单的结构,在软件开发中使用频率还是比较高的。
-
优点
- 提高性能:创建后在内存中只会存在一个实例,节约内存开支和实例化开支
- 受控访问:可以对请求实例的方法添加统一的限制
-
缺点
- 与单一职责原则冲突:职责过重,在一定程度上违背单一职责原则