news 2026/4/18 15:23:36

设计模式之-单例模式

作者头像

张小明

前端开发工程师

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/18 8:13:58

【详细解读】vivado时序分析报告怎么看?

目录 概念 IO输入延时约束 时序分析报告长什么样 模型 数据 时钟 建立时间裕量 数据路径(到达时间) 时钟路径(需求时间) 概念 时序分析报告,是时序分析器对于约束后的设计进行时序分析,得出的结论。可以查看约束后的效果是否满足时序要求。 IO输入延时约束 IO输入延时约束…

作者头像 李华
网站建设 2026/4/18 8:44:43

对比淘宝、京东、拼多多API,开启电商多元化运营模式!

在当今竞争激烈的电商环境中,商家往往需要同时布局多个平台(如淘宝、京东、拼多多)以最大化触达用户、分散风险并提升销售潜力。然而,多平台运营意味着需要对接多个不同的应用程序接口(API),这带…

作者头像 李华
网站建设 2026/4/18 0:12:10

儿童食品品牌如何做到70%复购率?

在当前同质化严重的儿童食品市场,一个新品牌要杀出重围有多难?传统玩法是砸钱投广告、铺渠道、做促销,但结果往往是获客成本高企,客户忠诚度低下。 业内有一家新兴儿童食品品牌却走了一条截然不同的路:不依赖大规模广…

作者头像 李华
网站建设 2026/4/18 11:57:17

什么是跨浏览器测试?

跨浏览器测试是在不同的浏览器和操作系统上测试网站或基于网络的应用程序的整体稳定性的过程。这种测试的目的是确保网站或应用程序的功能和性能在各种浏览器和操作系统上都是一致的,从而提供良好的用户体验。 跨浏览器测试包括检查网站或应用程序在不同浏览器上的…

作者头像 李华
网站建设 2026/4/18 1:48:50

4.3 Langfuse 集成实战:追踪 OpenAI、LangChain 和 LangGraph 应用

4.3 Langfuse 集成实战:追踪 OpenAI、LangChain 和 LangGraph 应用 导语:在上一章,我们已经成功地在本地运行了 Langfuse,并初步领略了其强大的追踪能力。现在,是时候将这项能力应用到我们之前构建的各种 AI 应用中了。本章将是一次聚焦于“集成”的实战演练。我们将分别针…

作者头像 李华
网站建设 2026/4/18 11:05:08

5.1 LoRA 微调,YYDS!一文带你入门低成本优化垂直领域大模型

LoRA 微调,YYDS!一文带你入门低成本优化垂直领域大模型 导语:欢迎来到课程的最后一周!在前四周,我们如同“装备大师”,学会了使用 Prompt、工具、框架、评估体系等“外功”来武装我们的 Agent。但面对某些高度专业的垂直领域(如医疗、法律、金融),我们发现,即使是 GP…

作者头像 李华