当前位置: 首页 > news >正文

设计模式之-单例模式

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组合起来就可以达到单例类的效果,这个例子也是缓存代理的应用之一

http://www.cnnetsun.cn/news/136807.html

相关文章:

  • SIEMENS 6SL3210-1PE33-0CL0 变频器
  • 软件测试常用的7种方法,最后一个是升职加薪关键!(零基础小白转行IT互联网高效进阶)
  • 【RTOS】EasyLog的移植与使用
  • 在数据库里玩“平行宇宙”:MatrixOne Data Branch 让数据也拥有Git 的分支/合并/对比/回滚(含跨集群同步)
  • 基于单片机的全自动洗衣机系统的设计
  • 5.6 模型部署与智能体集成实战
  • 基于单片机的球赛计分牌的设计
  • ArcGIS Pro 从入门到实战基础篇(10):地图菜单
  • Kotaemon与Redis/Memcached集成:构建高速缓存层
  • 【鸿蒙三方库编译】lycium_plusplus(lycium++)高效完成鸿蒙C/C++编译
  • 2025年度GEO服务商权威甄选指南:技术深度与商业价值的双重考量
  • 收藏备用!Java程序员转AI大模型:从技术沉淀到AI爆发的进阶之路
  • Python 爬虫实战:Session 会话维持爬取需登录内容
  • 基于移相全桥变换器的电池充电仿真模型,采用电压电流双闭环PI控制。 电池先经历CC模式而后进入...
  • 基于COMSOL模拟的水力压裂技术研究:固体力学与达西定理的应用
  • Redis 性能调优(二)
  • Doris 性能调优实践指南(可直接落地)
  • presum|二分try+滑窗cnt
  • Web自动化测试:Unittest单元测试框架
  • Apache2最佳实践
  • 实力派,也可以是偶像派
  • 基于单片机的多功能万年历
  • AI搜索时代:技术演进、产业分化与深度变革
  • SGMICRO圣邦微 SGM2019-2.5YC5G/TR SC70-5 线性稳压器(LDO)
  • 一文搞懂 低功耗蓝牙BLE 中的 ATT、GATT、MTU 与 20 字节限制
  • 别让“大锅饭”逼走你的Top Sales:揭秘薪酬误差的副作用
  • 27827828
  • 12.17 vue递归组件
  • QtScrcpy高刷投屏优化指南:告别卡顿,享受流畅体验
  • 终极移动端Windows应用运行指南:从零到流畅体验