不学点设计模式,你真当我是切图仔啊?【单例模式】

设计模式总觉得自己似懂非懂,直到最近开始阅读一些框架的源码,发现懂设计模式太重要了,方便理解业务,也能够给更快更合理得设计代码,那就写一下总结一下,方便自己以后复习

汇总

创建型模式:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。

结构型模式:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

行为型模式:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式、并发型模式和线程池模式。

什么是单例模式?

全局仅有一个实例以供访问操作,确保一个类只有一个实例,并提供一个全局访问点来访问该实例

优点&缺点

优点:

1、减少内存消耗,某些情况下可以提高性能。特别是在需要频繁访问或操作某个对象时,单例模式可以减少内存占用和计算开销

2、简单,对于需要全局访问的资源或状态,单例模式提供了一种简洁的方式。它使得开发者能够轻松地管理和维护这些资源或状态,而无需担心它们的创建和销毁

缺陷:

1、单例对象一般都是长生命周期对象,使用不当可能会导致内存泄漏

欢迎评论补充

使用场景

全局状态管理:单例模式可用于管理全局状态,如用户登录状态、应用配置等。通过单例模式,可以确保整个应用中只有一个状态管理实例,从而避免状态混乱和冲突。

弹窗管理:弹窗(如警告框、确认框等)是常见的交互元素。使用单例模式可以确保在同一时间只有一个弹窗实例存在,从而避免多个弹窗重叠或冲突的情况。

连接池管理:对于需要与后端服务器建立连接的前端应用(如WebSocket连接),单例模式可用于管理连接池。这样可以确保整个应用中只有一个连接池实例,从而避免资源浪费和连接冲突。

全局唯一的服务或工具类:例如,有些应用中可能需要一个全局唯一的日期格式化工具或请求拦截器等。这些工具或服务在整个应用中只需要一个实例,因此可以使用单例模式来实现。

实现方式

1、ES6的class实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
js复制代码// 单例模式
class Single {
constructor() {
if (!Single.instance) {
Single.instance = this;
}
return Single.instance;
}

createInstance() {
const obj = { name: "xxx" };
return obj;
}

getInstance() {
if (!Single.instance) {
Single.instance = this.createInstance();
}
return Single.instance;
}
}

const instance1 = new Single();
const instance2 = new Single();

console.log(instance1 === instance2); // true

2、闭包实现

1
2
3
4
5
6
7
8
9
10
js复制代码let Single = (function() {
// 闭包保存的唯一实例对象
let instance;
return function(name) {
if (instance) return instance
instance = { name: 'xxx' };
return instance;
}
})();
console.log(new Single() === new Single()); // true

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%