JavaScript中的设计模式 单例模式
作者:Ned 发布时间:2024-05-05 09:05:54
前言:
设计模式在我们编程中是十分重要的!
设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。
最近在学习设计模式,铁铁们一起来卷嘛?
1、什么是设计模式
在软件设计过程中,针对特定问题的简洁而优雅的解决方案。
把之前的经验总结并且合理运用到某处场景上,能够解决实际的问题。
2、设计模式五大设计原则(SOLID)
S-单一职责原则
即一个程序只做好一件事
O-开放封闭原则
可扩展开放,对修改封闭
L-里氏置换原则
子类能覆盖父类,并能出现在父类出现的地方
I-接口独立原则
保持接口的单一独立
D-依赖导致原则
使用方法只关注接口而不关注具体类的实现
3、为什么需要设计模式?
易读性
使用设计模式能够提升我们的代码可读性,提升后续开发效率
可拓展性
使用设计模式对代码解耦,能很好的增强代码的yi修改性和拓展性
复用性
使用设计模式可以复用已有的解决方案,无需重复相同工作
可靠性
使用设计模式能够增加系统的健壮性,使代码编写真正工程化
4、单例模式
定义:唯一&全局访问。保证一个类仅有一个实例,并提供一个访问它的全局访问点。
另外一种多例模式,通过一个类构造出多个不一样的实例,这就是多例模式。
单例模式与多例模式最本质的区别:实例的数量。
单例模式永远只有一个实例,这个实例可以被缓存起来,可以复用。
应用场景:就是能被缓存的内容,例如登录弹窗。
我觉得就是一个地方如果在你的项目中可以用到两次或两次以上,都可以尝试一下这个,能够减少很多代码。
来看这段伪代码:
const creatLoginLayer = () => {
const div = document.createElement("div");
div.innerHtml = "登录浮窗";
div.style.display = "none";
document.body.appendChild(div);
return div;
};
document.getElementById("loginBtn").onclick = () => {
const loginLayer = creatLoginLayer();
loginLayer.style.display = "block";
};
creatLoginLayer
的作用是创建一个登录浮窗并将节点添加到body
上,下面做的是登录按钮的一个点击事件,点击登录按钮就会创建登录浮窗并将display
从none
改为block
,将他显示出来。
这个逻辑是没毛病的,但是我们想一下,每点击一下登录按钮就要执行这些代码,一个项目中如果有很多地方要呢?我们上面这短短几行而已,如果是上百上千甚至上万呢?是不是就非常损耗性能,这个时候,我们的单例模式就派上了用场。
使用单例模式后:
const getSingle = (fn) => {
let result;
return (...rest) =>{
return result || (result = fn.apply(this.rest));
};
};
const creatLoginLayer = () => {
const div = document.createElement("div");
div.innerHtml = "登录浮窗";
div.style.display = "none";
document.body.appendChild(div);
return div;
};
const createSingleLoginLayer = getSingle(createLoginLayer);
document.getElementById("loginBtn").onclick = () => {
const loginLayer = createSingleLoginLayer();
loginLayer.style.display = "block";
};
可以见到,增加了一个getSingle
函数,这里有个闭包的概念,result
变量只要一直在引用就不会被销毁,起到了一个缓存的作用,函数的参数是一个function
,如果result
是null
或者undefined
就执行后面的逻辑,将这个传进来的函数的返回值也就是这个div赋给result
,这样我们下面的函数就执行一次就可以了,下次调用的时候result
有值,所以就直接返回了,不会在执行后面的逻辑。
来源:https://juejin.cn/post/7011458744437440542


猜你喜欢
- 一、mysqldump 简介mysqldump 是 MySQL 自带的逻辑备份工具。它的备份原理是通过协议连接到 MySQL 数据库,将需要
- 一般情况下,运行tensorflow时,默认会占用可以看见的所有GPU,那么就会导致其它用户或程序无GPU可用,那么就需要限制程序对GPU的
- 简单方法:models.pyclass IceCreamBar(models.Model): title
- 在SQL查询分析器执行以下代码就可以了。declare @t varchar(255),@c varchar(255)declare tab
- 前言自动帮助记录每次文件的改动,同时协作永工作学习git命令是充分必要的集中式和分布式分布式每个人电脑都是一个完整的版本库,也有类似中央服务
- setuptools模块和pip模块是python进行第三方库扩展的极重要工具,例如我们在需要安装一些爬虫或者数据分析的包时就可以使用pip
- Oracle的系统要求企业版:CPU最低PENTIUM200M推荐PENTIUMIII1G以上 内存最低128M推荐512M 硬盘空间系统盘
- python线程池ThreadPoolExecutor,传单个参数和多个参数这是线程池传单个参数的from concurrent.futur
- 前言这几年对运维人员来说最大的变化可能就是公有云的出现了,我相信可能很多小伙伴公司业务就跑在公有云上, 因为公司业务关系,我个人
- 1、生成 servie.yaml1.1、yaml转jsonservice模板yamlapiVersion: v1kind: Servicem
- 用ACCESS数据库开发的网站,当随着网站数据量的不断增长.数据库的容量也是不断加大.这让ASP程序速度直线下降.如果才能让ACCESS数据
- 本文实例讲述了C#窗体读取EXCEL并存入SQL数据库的方法。分享给大家供大家参考。具体实现方法如下:windows窗体上放了一个Textb
- 1. 简介在 Go 语言中,new 和 make 是用于创建对象的两个内建函数,它们的使用方式和作用有所不同。正确理解 new 和 make
- 实例如下所示:import timeimport pickleimport osimport reclass LogIncScaner(ob
- 目录程序的组织结构顺序结构对象的布尔值选择结构单分支结构小实验双分支结构小实验多分支结构小实验python代码的独特写法分支结构_嵌套if的
- 本文实例讲述了python装饰器原理与用法。分享给大家供大家参考,具体如下:你会Python嘛?我会!那你给我讲下Python装饰器吧!Py
- go的各种import最简单的:package main import "fmt"func main() {  
- 本文实例为大家分享了用python实现五子棋的具体代码,供大家参考,具体内容如下# 制作一个棋盘"""++++
- 状态模式状态模式,当对象的内部状态发生了改变的时候,允许对象执行不同的流程。优点:封装了状态转换规则。枚举了可能的状态,在枚举状态之前需要确
- 本文介绍了在js和asp中使用FileSystemObject(fso)来: 创建、添加或删除数据,以及读取文件; 移动、复制和删除文件;创