news 2026/4/23 15:36:02

设计模式之-单例模式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
设计模式之-单例模式

1.创建一个单例类

classSingleton{constructor(name){this.name=name;}staticinstance=null;getName(){console.log(this.name);}staticgetInstance(name){if(!Singleton.instance){Singleton.instance=newSingleton(name);}returnSingleton.instance;}}consta=Singleton.getInstance('a');constb=Singleton.getInstance('b');console.log(a===b)// true

2.我们通过Singleton.getInstance来获取Singleton类的唯一对象,这种方式相对简单,但有一个问题,就是增加了这个类的‘不透明性’,Singleton类的使用者必须知道这是一个单例类,跟以往通过new的方式不同,这里便要用Singleton.getInstance来获取对象。
3.透明的单例模式

classCreateDiv{staticinstance=null;constructor(html){if(CreateDiv.instance){returnCreateDiv.instance;}this.html=html;this.init();returnCreateDiv.instance=this;}init(){constdiv=document.createElement('div');div.innerHTML=this.html;document.body.appendChild(div);}}constaa=newCreateDiv('aa');constbb=newCreateDiv('bb');console.log(aa===bb)// true

4.虽然现在完成了一个透明的单例类的编写,但是他同样又一些缺点,在这段代码中,CreateDiv的构造器实际上负责了两件事情。一个是创建对象和执行初始化函数,第二个是保证只有一个对象,这是违反“单一职责原则的”,将来如果我们需要利用这个累,在页面上创建千千万万个div,即要让这个类从单例类变成一个普通的可以产生多个实例的类,那么我们必须改写CreateDiv这个类,把控制创建为宜对象的那一段去掉,这种修改会给我们带来不必要的烦恼
5.用代理实现单例模式

classCreateDiv{staticinstance=null;constructor(html){this.html=html;this.init();}init(){constdiv=document.createElement('div');div.innerHTML=this.html;document.body.appendChild(div);}}classProxySingletonCreateDiv{staticinstance=null;constructor(html){if(!ProxySingletonCreateDiv.instance){ProxySingletonCreateDiv.instance=newCreateDiv(html)}returnProxySingletonCreateDiv.instance;}}constaa=newProxySingletonCreateDiv('aa');constbb=newProxySingletonCreateDiv('bb');console.log(aa===bb)// true

6.通过引入代理类的方式,我们同样完成了一个单例模式的编写,跟之前不同的是,现在我们把负责管理单例的逻辑转移到了代理类ProxySingletonCreateDiv中,这样一来,CreateDiv就变成了一个普通的类,他跟ProxySingletonCreateDiv组合起来就可以达到单例类的效果,这个例子也是缓存代理的应用之一

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 14:35:12

软考-系统集成项目管理工程师常考案例题:项目范围管理

一、范围管理计划用于指导如下过程和相关工作 1.制定项目范围说明书; 2.根据详细项目范围说明书创建WBS; 3.确定如何审批和维护范围基准; 4.正式验收已完成的项目可交付成果。 二、需求管理计划的主要内容 1.如何规划、跟踪和报告各种需求活动…

作者头像 李华
网站建设 2026/4/20 23:38:32

springcloud基于微服务架构企业员工工作流引擎的研究_pw80f4m7

文章目录 具体实现截图主要技术与实现手段关于我本系统开发思路java类核心代码部分展示结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式! 具体实现截图 同行可拿货,招校园代理 springcloud_pw80f4m7 基于微服务架构企业员工工作流…

作者头像 李华
网站建设 2026/4/23 13:00:22

springcloud基于微服务架构的博客博文学习平台的设计与实现_0ov69h80

文章目录具体实现截图主要技术与实现手段关于我本系统开发思路java类核心代码部分展示结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!具体实现截图 同行可拿货,招校园代理 springcloud_ov69h80 基于微服务架构的博客博文学习平…

作者头像 李华
网站建设 2026/4/23 11:34:07

VMware ESXI 8.0安装vCenter 8.0

一、先在ESXI上创建一台windows虚拟机二、下载ISO VMware-VCSA-all-8.0.2-23504390.iso 下载以后,想办法放入上面开的windows虚拟机上三、安装VCSA按步骤安装即可,安装过程会自动在esxi上创建VCSA的虚拟机出现这个页面,就代表装完&#xff0c…

作者头像 李华
网站建设 2026/4/23 14:47:34

Vmware扩展空间发现文件系统空间不足

有小伙伴的虚拟机用着用着,发现硬盘空间不足了,想扩展一下空间,结果明明有系统可用空间,结果硬是扩展不了,下面就列出解决方案:一,添加第二块硬盘图1.1二,扩容:增加新分区1&#xff…

作者头像 李华
网站建设 2026/4/23 11:35:04

基于单片机与物联网平台的智能花盆设计

基于单片机与物联网平台的智能花盆设计 第一章 绪论 传统盆栽种植中,浇水不当、环境不适是植物死亡的主要原因:据园艺协会数据,约60%的室内植物因浇水过多或过少枯萎,30%因光照、温度不适生长不良。人工养护需频繁观察&#xff0c…

作者头像 李华