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

代码实现:

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

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

登录
```
-->
这里使用了闭包,将控制变量放到闭包里,防止全局污染,当第一次点击时,创建并显示登录框,再次点击后,不再进行创建直接显示。
这样就实现了这个登录框的惰性单例模式,但是他存在以下问题:
- 仍然违反了单一职责原则,管理单例和创建对象的代码放在了同一函数内部。
- 如果以后我想创建一个单例的表格,一个单例的iFrame,还要每次都这样重复写一遍,如法炮制
所以有没有一种通用的方法抽象这种模式呢?
通用的单例模式
先不考虑创建的东西是什么,我们先把管理单例的代码抽象出来,创建对象的方法当做此单例函数的参数传入:

我们创建了一个通用的单例函数,只专注与单例相关的代码,接受一个fn参数,将fn的执行结果存到result中,result由于在函数闭包里,所以不会被销毁。将来使用时result如果是已赋值的,那么直接返回这个单例值,这样如果需要创建一个单例的iFrame,只需要写一个代码逻辑与createLoginDiv差不多的createiFrame,放到getSingle里返回即可使用。
通过结合前一篇[JavaScript设计模式] 什么是单例模式的学习,我们了解了单例模式,尤其以惰性单例模式这种概念,在需要的时候才去创建对象,而且是唯一的对象。还有单一职责原则,创建对象和管理单例被放在两个不同的方法中,组合起来以达到我们想要的目的。
[JavaScript设计模式]惰性单例模式的更多相关文章
- JavaScript设计模式之单例模式【惰性单例】
在提高开发水平,往中高级前端工程师中,利用设计模式是必不可少的一条道路.掌握设计模式的思想远远比硬套重要,因为设计模式是一种思想,不局限于开发语言.但实际上由于语言的特性不同,往往在实现的时候会有不少 ...
- 再起航,我的学习笔记之JavaScript设计模式10(单例模式)
单例模式 单例模式(Singleton) : 又被称为单体模式,是只允许实例化一次的对象类.一个类有且仅有一个实例,并且自行实例化向整个系统提供. 命名空间 单例模式可能是JavaScript中我们最 ...
- JavaScript设计模式_01_单例模式
最近项目不太忙,难得有时间看看书,平时挺喜欢js这门语言.也看过很多高级教程,觉得自己还是比较热衷于js的设计模式.这一次重温一下<JavaScript设计模式与开发实践>,开篇为单例模式 ...
- JavaScript设计模式,单例模式!
单例设计模式:保证一个类仅有一个实例,并且提供一个访问它的全局访问点.有些对象只需要一个,这时可用单例模式. 传统的单例模式 和new 创建对象的调用不一样 调用者要调用xxx.getInstance ...
- 第一章 --- 关于Javascript 设计模式 之 单例模式
首先我们对单例模式先进行理论上的讲解,接下来,我们再通过具体的代码示例,来讲解,这个单例模式的使用场景和这种模式的优缺点 (这个系列的所有关于设计模式的都是面向Javascript) 一.理论定义: ...
- JavaScript设计模式之单例模式
一.单例模式概念 单例就是保证一个类只有一个实例,实现方法一般是先判断实例存在与否,如果存在直接返回,如果不存在就创建了再返回,这就确保了一个类只有一个实例对象.在JavaScript里,单例作为一个 ...
- 「设计模式」JavaScript - 设计模式之单例模式与场景实践
单例介绍 上次总结了设计模式中的module模式,可能没有真真正正的使用在场景中,发现效果并不好,想要使用起来却不那么得心应手, 所以这次我打算换一种方式~~从简单的场景中来看单例模式, 因为Java ...
- JavaScript设计模式-7.单例模式
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- JavaScript设计模式(单例模式)
单例模式是一种简单但非常实用的模式,特别是惰性单例技术,在合适的时候才创建对象,并且只创建唯一的一个.下面我们来逐步了解单例模式的用法. 一.简版单例模式: var Singleton = funct ...
随机推荐
- [C++] 自动关闭右下角弹窗
最近腾讯.迅雷等各种客户端,都越发喜欢在屏幕的右下角弹框了. 有骨气的人当然可以把这些软件卸载了事,但是这些客户端在某些情况下却又还是有用的.怎么办呢? 作为码农,自己实现一个自动关闭右下角弹窗的程序 ...
- 判断当前所使用python的版本和来源
import sys print(sys.prefix) print(sys.executable) 怎样判断当前py文件在什么版本的python环境下运行 import sys print(sys. ...
- .NET C#与Java比较——Servlet
目录 1. Servlet 和 Ashx(一般处理程序) 2. Servlet 和 JSP 3. Servlet的生命周期 4. Java Filter 和 HttpModule,ActionFilt ...
- 2018-4-29-C#-金额转中文大写
title author date CreateTime categories C# 金额转中文大写 lindexi 2018-04-29 09:50:38 +0800 2018-04-02 21:4 ...
- Spring Cloud探路(三)REST 客户端Feign
Declarative REST Client: Feign Feign is a declarative web service client. It makes writing web servi ...
- Java中getBytes()方法--使用详解
getBytes()方法详解 在Java中,String的getBytes()方法是得到一个操作系统默认的编码格式的字节数组.这表示在不同的操作系统下,返回的东西不一样! 1. str.getByte ...
- 一眼看懂promise async的区别
// promise方法 let p1 = new Promise((resolve,reject) => { setTimeout(() => { resolve('我是p1') },4 ...
- JS 逻辑运算符 ||、 &&, 位运算符 |、&
1.JS中的||符号: 运算方法: 只要“||”前面为false,不管“||”后面是true还是false,都返回“||”后面的值. 只要“||”前面为true,不管“||”后面是true还是fals ...
- LuoguP2765 魔术球问题
LuoguP2765 魔术球问题 首先,很难看出来这是一道网络流题.但是因为在网络流24题中,所以还是用网络流的思路 首先考虑完全平方数的限制. 如果\(i,j\)满足\(i < j\) 且 $ ...
- [板子]SPFA算法+链式前向星实现最短路及负权最短路
参考:https://blog.csdn.net/xunalove/article/details/70045815 有关SPFA的介绍就掠过了吧,不是很赞同一些博主说是国内某人最先提出来,Bellm ...