惰性单例模式

之前介绍了JS中类的单例模式,这次我们讨论下单例模式的应用。在众多网站中,登录框的实现方式就是一个单例,点击一次就展示一次,所以我们可以在页面加载好的时候就创建一个登录框,点击页面上的登录按钮时,用于控制它的显示和隐藏。

代码实现:


登录

```
-->

这样的问题就是,如果用户进来后所有的操作根本没有用到登录,那创建登录框这个操作就是无用的,所以改进为当用户点击登录按钮时才开始创建登录框,如下:


登录

```
-->

现在达到了惰性的目的,但失去了单例的效果。每次点击登录都会创建一个登录框,所以还要加个变量控制这个框唯一显示:

登录

```
-->

这里使用了闭包,将控制变量放到闭包里,防止全局污染,当第一次点击时,创建并显示登录框,再次点击后,不再进行创建直接显示。
这样就实现了这个登录框的惰性单例模式,但是他存在以下问题:

  1. 仍然违反了单一职责原则,管理单例和创建对象的代码放在了同一函数内部。
  2. 如果以后我想创建一个单例的表格,一个单例的iFrame,还要每次都这样重复写一遍,如法炮制

所以有没有一种通用的方法抽象这种模式呢?

通用的单例模式

先不考虑创建的东西是什么,我们先把管理单例的代码抽象出来,创建对象的方法当做此单例函数的参数传入:

我们创建了一个通用的单例函数,只专注与单例相关的代码,接受一个fn参数,将fn的执行结果存到result中,result由于在函数闭包里,所以不会被销毁。将来使用时result如果是已赋值的,那么直接返回这个单例值,这样如果需要创建一个单例的iFrame,只需要写一个代码逻辑与createLoginDiv差不多的createiFrame,放到getSingle里返回即可使用。
通过结合前一篇[JavaScript设计模式] 什么是单例模式的学习,我们了解了单例模式,尤其以惰性单例模式这种概念,在需要的时候才去创建对象,而且是唯一的对象。还有单一职责原则,创建对象和管理单例被放在两个不同的方法中,组合起来以达到我们想要的目的。

最新文章

  1. 当C++多继承遇上类型转换[转]
  2. 从API请求数据的方法(主要适用于tp5)
  3. spring02
  4. [原创]java WEB学习笔记100:Spring学习---Spring Bean配置:SpEL详细介绍及代码演示
  5. java操作数据库出现(][SQLServer 2000 Driver for JDBC]Error establishing socket.)的问题所在即解决办法
  6. 微软职位内部推荐-Senior Software Engineer
  7. WisDom.Net 框架设计(八) 持久层
  8. trim()方法去除字符串首尾空格
  9. Find the maximum(规律,大数)
  10. 玩转html5(二)----用canvas结合脚本在画布上画简单的图(html5又一强大功能)
  11. jQuery 之玩转 checkbox
  12. jquery中的下拉框
  13. tomcat启动命令行中文乱码
  14. java的几种模式以及如何实现的
  15. list 转成 tree
  16. Mysql数据库性能优化(一)
  17. JS 异步系列 —— Promise 札记
  18. easyui webapi
  19. 所有HTTP请求参数及报文查看SERVLET【原】
  20. EF Code First 整不明白 继续完善

热门文章

  1. pytorch之expand,gather,squeeze,sum,contiguous,softmax,max,argmax
  2. 使用java实现CNN的实战
  3. Django入门2--Django的应用和开发第一个Template
  4. git提交时如何忽略一些文件
  5. httpclient: Content-Length header already present问题
  6. H3C配置路由器作为TFTP客户端
  7. Jenkins 配置自动合并 release 分支到 master 分支
  8. Spring Security学习笔记-自定义Spring Security过滤链
  9. 2019-1-29-UWP-IRandomAccessStream-与-Stream-互转
  10. codeforces 1269 E K Integers