说说你对单例模式的理解?如何实现?

在这里插入图片描述

一、是什么

单例模式(Singleton Pattern):创建型模式,提供了一种创建对象的最佳方式,这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建

在应用程序运行期间,单例模式只会在全局作用域下创建一次实例对象,让所有需要调用的地方都共享这一单例对象,如下图所示:
在这里插入图片描述
从定义上来看,全局变量好像就是单例模式,但是一般情况我们不认为全局变量是一个单例模式,原因是:

  • 全局命名污染
  • 不易维护,容易被重写覆盖

二、实现

在javascript中,实现一个单例模式可以用一个变量来标志当前的类已经创建过对象,如果下次获取当前类的实例时,直接返回之前创建的对象即可,如下:

// 定义一个类
function Singleton(name) {this.name = name;this.instance = null;
}
// 原型扩展类的一个方法getName()
Singleton.prototype.getName = function() {console.log(this.name)
};
// 获取类的实例
Singleton.getInstance = function(name) {if(!this.instance) {this.instance = new Singleton(name);}return this.instance
};// 获取对象1
const a = Singleton.getInstance('a');
// 获取对象2
const b = Singleton.getInstance('b');
// 进行比较
console.log(a === b);

使用闭包也能够实现,如下:

function Singleton(name) {this.name = name;
}
// 原型扩展类的一个方法getName()
Singleton.prototype.getName = function() {console.log(this.name)
};
// 获取类的实例
Singleton.getInstance = (function() {var instance = null;return function(name) {if(!this.instance) {this.instance = new Singleton(name);}return this.instance}        
})();// 获取对象1
const a = Singleton.getInstance('a');
// 获取对象2
const b = Singleton.getInstance('b');
// 进行比较
console.log(a === b);

也可以将上述的方法稍作修改,变成构造函数的形式,如下:

// 单例构造函数
function CreateSingleton (name) {this.name = name;this.getName();
};// 获取实例的名字
CreateSingleton.prototype.getName = function() {console.log(this.name)
};
// 单例对象
const Singleton = (function(){var instance;return function (name) {if(!instance) {instance = new CreateSingleton(name);}return instance;}
})();// 创建实例对象1
const a = new Singleton('a');
// 创建实例对象2
const b = new Singleton('b');console.log(a===b); // true

三、使用场景

在前端中,很多情况都是用到单例模式,例如页面存在一个模态框的时候,只有用户点击的时候才会创建,而不是加载完成之后再创建弹窗和隐藏,并且保证弹窗全局只有一个

可以先创建一个通常的获取对象的方法,如下:

const getSingle = function( fn ){let result;return function(){return result || ( result = fn .apply(this, arguments ) );}
}; 

创建弹窗的代码如下:

const createLoginLayer = function(){var div = document.createElement( 'div' );div.innerHTML = '我是浮窗';div.style.display = 'none';document.body.appendChild( div );return div;
}; const createSingleLoginLayer = getSingle( createLoginLayer ); document.getElementById( 'loginBtn' ).onclick = function(){var loginLayer = createSingleLoginLayer();loginLayer.style.display = 'block';
};

上述这种实现称为惰性单例,意图解决需要时才创建类实例对象

并且Vuex、redux全局态管理库也应用单例模式的思想,如下图:

在这里插入图片描述

现在很多第三方库都是单例模式,多次引用只会使用同一个对象,如jquery、lodash、moment…

参考文献

  • https://zh.wikipedia.org/zh-hans/%E5%8D%95%E4%BE%8B%E6%A8%A1%E5%BC%8F
  • https://www.runoob.com/design-pattern/singleton-pattern.html
  • https://juejin.cn/post/6844903874210299912#heading-5

如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/19724.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

day23--单元测试-反射-注解-动态代理

day23-单元测试、反射 恭喜同学们,Java主要的知识我们其实已经学习得差不多了。今天同学们再把单元测试、反射、注解、动态代理学习完。Java的基础知识就算全齐活了。 首先,我们进入单元测试的学习。 一、单元测试 1.1 单元测试快速入门 所谓单元测…

北斗消防系统实现林海无信号应急通信,高效防灾救灾开拓应急救援新通道

最近,贵州多地爆发的重大山火,火势 21日这12天里,贵州发生森林火情221起,当地包括武警、消防、专业救援队伍等在内的9千多人连续扑救,1.5万名基层党员干部、民兵、群众及志愿者协助救火。目前,贵州全省火灾…

OSPF状态机+SPF算法

OSPF状态机 1.点到点网络类型 down-->init-->(前提为可以建立邻接)exstart——>exchange-->若查看邻接的DBD 目录后发现不用进行LSA 直接进入ful。若查看后需要进行查询、应答先进入loading,在查询应答完后再进入 fuIl: 2.MA网络类型 down --&g…

【计算机网络】——概述(图文并茂)

概述 一.信息时代的计算机网络二.互联网概述1.网络,互连网,互联网(因特网)1.网络2.互连网3.互联网(因特网) 2.互联网简介1.互联网发展的三个阶段2.互联网服务提供者(ISP)3.互联网的组…

HTTP/超文本传输协议(Hypertext Transfer Protocol)及HTTP协议通信步骤介绍和请求、响应阶段详解;

目录 一、HTTP/超文本传输协议 特点和功能 请求-响应模型 版本和扩展 安全性和加密 二、HTTP协议通信步骤介绍 三、请求、响应阶段详解 HTTP请求 HTTP响应 示例 一、HTTP/超文本传输协议 HTTP/超文本传输协议(Hypertext Transfer Protocol)是…

浅谈人机交互

人机交互(Human-Computer Interaction,HCI),是指关于设计、评价和实现供人们使用的交互式计算机系统,并围绕相关的主要现象进行研究。 狭义的讲,人机交互技术主要是研究人与计算机之间的信息交换&#xff0…

wpf窗体背景镜像渐变效果实现

<Window.Background> <!--镜像渐变--> <RadialGradientBrush Center"0.5,0" GradientOrigin"0.5,-0.5" RadiusX"0.7" RadiusY"1.2"> <GradientStop Color"#ff61baff" Offset"0&q…

【康耐视国产案例】智能AI相机:深度解析DataMan 380大视野高速AI读码硬实力

随着读码器技术的不断更新迭代&#xff0c;大视野高速应用成为当前工业读码领域的关键发展方向。客户对大视野高速读码器的需求源于其能显著减少生产成本并提升工作效率。然而&#xff0c;大视野应用场景往往伴随着对多个条码的读取需求&#xff0c;这无疑增加了算法的处理负担…

cuda 11.6 pytorch安装

在安装之前&#xff0c;需要先配置GPU环境&#xff08;安装CUDA和CudaNN) 命令行输入nvidia-smi&#xff0c;查看驱动信息 nvidia-smi 安装相应的CUDA 和CUDANN 验证&#xff1a;输入nvcc --version 或者nvcc -V 进行检查 nvcc --version nvcc -V 在anaconda里创建环境 co…

NLP课程笔记-基于transformers的自然语言处理入门

toc 项目地址 https://github.com/datawhalechina/learn-nlp-with-transformers/ 2017年&#xff0c;Attention Is All You Need论文&#xff08;Google Brain&#xff09;首次提出了Transformer模型结构并在机器翻译任务上取得了The State of the Art(SOTA, 最好)的效果。2…

ADB安装教程

1 adb简介 Android 调试桥 (adb) 是一种功能多样的命令行工具&#xff0c;可让您与设备进行通信。 adb命令可用于执行各种设备操作&#xff0c;例如安装和调试应用。 adb 提供对 Unix shell&#xff08;可用来在设备上运行各种命令&#xff09;的访问权限。它是一种客户端-服务…

一篇文章带你弄懂Java集合的泛型

目录 第一问&#xff1a;什么是泛型&#xff1f;有什么好处&#xff1f; 第二问&#xff1a;泛型是如何实现的呢&#xff1f; 第三问&#xff1a;类型擦除的缺点有哪些&#xff1f; 第四问&#xff1a;泛型中上下界限定符extends和super有什么区别&#xff1f; 第五问&…

HR人才测评,如何做中层管理人员的素质测评?

中层管理人员是企业中的重要力量&#xff0c;他们是连接高层管理和基层员工的桥梁&#xff0c;对企业的发展至关重要。因此&#xff0c;对中层管理人员的素质测评尤为重要。下面&#xff0c;我将介绍一些HR人才测评的方法和步骤&#xff0c;以帮助企业准确评估中层管理人员的素…

中信银行积极开展2024年金融科技活动周宣传活动

近日&#xff0c;2024年全国金融“科技活动周”正式启动。中信银行围绕“弘扬科学家精神 激发全社会创新活力”为主题&#xff0c;积极面向公众宣传各类金融知识&#xff0c;全面营造热爱科学、崇尚科学的社会氛围。 自5月25日起&#xff0c;中信银行通过全国网点大屏播放宣传…

【C++】77组合

给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 使用回溯算法。我们可以按照以下步骤来实现&#xff1a; 创建一个辅助函数 backtrack&#xff0c;用来进行回溯搜索。其中包括当前组合的状态变量 current、起始…

C# list集合

一、list集合基本使用 1.添加元素 ① 单个元素添加 List<int> list new List<int>();for (int i 0; i < 3; i){list.Add(i);}//输出&#xff1a;0,1,2 ②初始化时添加元素 List<int> list2 new List<int> { 1, 2, 3 };//输出&#xff1a;0,1…

Jenkins从放弃到入门:部署、配置与应用

目录 Jenkins详解 一、Jenkins介绍 1、Jenkins 功能 2、Jenkins 概念 3、Jenkins 目的 4、Jenkins 特性 5、产品发布流程 二、Jenkins CI/CD 流程 三、部署Jenkins git 1、jenkins 安装 yum 安装 jenkins *jenkins 依赖 java 环境 #注意2.346之后的版本不再支持jdk…

RabbitMQ-发布/订阅模式

1、发布/订阅模式介绍 在普通的生产者、消费者模式&#xff0c;rabbitmq会将消息依次传递给每一个消费者&#xff0c;一个worker一个&#xff0c;平均分配&#xff0c;这就是Round-robin调度方式&#xff0c;为了实现更加复杂的调度&#xff0c;我们就需要使用发布/订阅的方式…

EXSI虚拟机新增磁盘并将空间扩充到已有分区

这里写自定义目录标题 1、在EXSI虚拟机中新增一块磁盘配置大小2、确认新磁盘3、格式化新分区4、添加新分区到LVM5、将新增分区添加到已有分区里 1、在EXSI虚拟机中新增一块磁盘配置大小 注意事项&#xff1a; (1)需确保虚拟机已关闭活处于维护模式&#xff0c;避免数据丢失 (2…

Spring Boot详解:深入了解与实践

文章目录 1. Spring Boot简介1.1 什么是Spring Boot&#xff1f;1.2 Spring Boot的历史背景1.3 Spring Boot的核心特点 2. Spring Boot的核心概念2.1 自动配置2.1.1 自动配置原理2.1.2 自定义配置 2.2 Spring Boot Starter2.3 Spring Boot CLI 3. Spring Boot的主要功能模块3.1…