[JavaScript设计模式]惰性单例模式
惰性单例模式
之前介绍了JS中类的单例模式,这次我们讨论下单例模式的应用。在众多网站中,登录框的实现方式就是一个单例,点击一次就展示一次,所以我们可以在页面加载好的时候就创建一个登录框,点击页面上的登录按钮时,用于控制它的显示和隐藏。
代码实现:
登录
```
-->
这样的问题就是,如果用户进来后所有的操作根本没有用到登录,那创建登录框这个操作就是无用的,所以改进为当用户点击登录按钮时才开始创建登录框,如下:
登录
```
-->
现在达到了惰性的目的,但失去了单例的效果。每次点击登录都会创建一个登录框,所以还要加个变量控制这个框唯一显示:
登录
```
-->
这里使用了闭包,将控制变量放到闭包里,防止全局污染,当第一次点击时,创建并显示登录框,再次点击后,不再进行创建直接显示。
这样就实现了这个登录框的惰性单例模式,但是他存在以下问题:
- 仍然违反了单一职责原则,管理单例和创建对象的代码放在了同一函数内部。
- 如果以后我想创建一个单例的表格,一个单例的iFrame,还要每次都这样重复写一遍,如法炮制
所以有没有一种通用的方法抽象这种模式呢?
通用的单例模式
先不考虑创建的东西是什么,我们先把管理单例的代码抽象出来,创建对象的方法当做此单例函数的参数传入:
我们创建了一个通用的单例函数,只专注与单例相关的代码,接受一个fn参数,将fn的执行结果存到result中,result由于在函数闭包里,所以不会被销毁。将来使用时result如果是已赋值的,那么直接返回这个单例值,这样如果需要创建一个单例的iFrame,只需要写一个代码逻辑与createLoginDiv差不多的createiFrame,放到getSingle里返回即可使用。
通过结合前一篇[JavaScript设计模式] 什么是单例模式的学习,我们了解了单例模式,尤其以惰性单例模式这种概念,在需要的时候才去创建对象,而且是唯一的对象。还有单一职责原则,创建对象和管理单例被放在两个不同的方法中,组合起来以达到我们想要的目的。
最新文章
- 当C++多继承遇上类型转换[转]
- 从API请求数据的方法(主要适用于tp5)
- spring02
- [原创]java WEB学习笔记100:Spring学习---Spring Bean配置:SpEL详细介绍及代码演示
- java操作数据库出现(][SQLServer 2000 Driver for JDBC]Error establishing socket.)的问题所在即解决办法
- 微软职位内部推荐-Senior Software Engineer
- WisDom.Net 框架设计(八) 持久层
- trim()方法去除字符串首尾空格
- Find the maximum(规律,大数)
- 玩转html5(二)----用canvas结合脚本在画布上画简单的图(html5又一强大功能)
- jQuery 之玩转 checkbox
- jquery中的下拉框
- tomcat启动命令行中文乱码
- java的几种模式以及如何实现的
- list 转成 tree
- Mysql数据库性能优化(一)
- JS 异步系列 —— Promise 札记
- easyui webapi
- 所有HTTP请求参数及报文查看SERVLET【原】
- EF Code First 整不明白 继续完善
热门文章
- pytorch之expand,gather,squeeze,sum,contiguous,softmax,max,argmax
- 使用java实现CNN的实战
- Django入门2--Django的应用和开发第一个Template
- git提交时如何忽略一些文件
- httpclient: Content-Length header already present问题
- H3C配置路由器作为TFTP客户端
- Jenkins 配置自动合并 release 分支到 master 分支
- Spring Security学习笔记-自定义Spring Security过滤链
- 2019-1-29-UWP-IRandomAccessStream-与-Stream-互转
- codeforces 1269 E K Integers