单例模式的定义是:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

先看一下,在Js中使用传统面向对象的单例模式。

面向对象的单例模式,是通过new关键字来实例化我们想要的对象,并将其赋值给instance。

通过使用变量instance来判断是否已经实例化,这里将创建一个div和保证只有一个对象的两个功能分割开来实现,对于代码的可维护性提高了很多。假设我们有一天,需要创建多个div,直接利用创建div的类就可以了,而不需要额外的修改。

代理类是属于代理模式中的应用,会在代理模式中详细学习。

var CreateDiv = function(html){this.html =html;this.init();};CreateDiv.prototype.init= function(){var div = document.createElement('div');div.innerHTML= this.html;document.body.appendChild(div);};//引入代理类proxySingletonCreateDivvar proxySingletonCreateDiv = (function(){varinstance;return function(html){if(!instance)  instance = newCreateDiv(html)returninstance;}})();//测试var a = new proxySingletonCreateDiv('svent1');var b = new proxySingletonCreateDiv('svent2');console.log(a=== b);  //true

我们知道单例模式的核心是确保只有一个实例,并提供全局访问。在JS的世界中,是不存在实质的可使用的类的,上面的只是模仿面向对象语言的实现方法,但Js有全局变量的特性,虽然它不是单例模式,但通常可以把全局变量当作单例模式来使用,如上面的例子可以修改为如下:

将instance作为全局变量同时也作为唯一的创建的div。

var CreateDiv = function(html){this.html =html;this.init();};CreateDiv.prototype.init= function(){var div = document.createElement('div');div.innerHTML= this.html;document.body.appendChild(div);};var instance = new CreateDiv('svent1');//测试var a =instance;var b =instance;console.log(a=== b);  //true

 

惰性单例

惰性单例指的是在需要的时候才创建对象实例。

在实际开发中,惰性单例的技术非常有用,正如当我们在web.qq.com即网页版QQ中,点击左边的导航里的QQ头像时,会弹出一个登录框,很明显这个登录框是唯一的,不可能同时出现,并且我们可以在用户点击的时候才来生成该登录框,这样当用户仅仅是浏览页面而不需要登陆时,可以节省一些DOM节点。

在上面的面向对象开发单例模式的例子中,采用的就是懒惰单例,当用户第一次new代理类时,才开始实例化CreateDiv类。

首先来写一个登录框例子:

//创建登录框和判断单例var createLoginLayer = (function(){vardiv;return function(){if(!div){div= document.createElement('div');......};returndiv;}})();//点击事件document.getElementById('loginBtn').onclick = function(){var loginLayer =createLoginLayer();...}

上面这个例子实际上还是有问题的,它把创建对象和管理单例的逻辑都放在一起,如果我们下次需要创建页面中唯一的iframe或其他标签,那么就得把上面的代码照抄一遍。

//创建登录框和判断单例var createIframe = (function(){variframe;return function(){if(!iframe){iframe= document.createElement('iframe');......};returniframe;}})();//点击事件document.getElementById('loginBtn').onclick = function(){var loginLayer =createIframe();...}

根据设计模式的单一职责原则,我们需要把不变的部分隔离出来,如管理单例完成可以抽象出来,用一个变量来标志是否创建过对象,如果是,则在下次直接返回该对象。

因为result变量在闭包中,所以永远不会被销毁。

var getSingle = function(fn){varresult;return function(){return result || (result = fn.apply(this,arguments));}}

最后的实际代码:

在这个实验中,我们把创建对象的职责和管理单例的职责分别放在两个方法里,这两个方法可以独立变化而互不影响,而当他们链接在一起,就完成了创建唯一实例对象的功能。

var getSingle = function(fn){varresult;return function(){return result || (result = fn.apply(this,arguments));}};var createDiv = function(){div= document.createElement('div');......returndiv;}var createLoginLayer =getSingle(createDiv);//点击事件document.getElementById('loginBtn').onclick = function(){var loginLayer =createLoginLayer();...}

转载于:https://www.cnblogs.com/Darlietoothpaste/p/6675310.html

JavaScript设计模式 单例模式相关推荐

  1. JavaScript设计模式——单例模式的理解与应用

    JavaScript设计模式--对单例模式的一些见解 JavaScript设计模式主要分类: ①创建型设计模式,例如单例模式.工厂模式 ②结构型设计模式,例如装饰者模式.适配器模式 ③行为型设计模式, ...

  2. JavaScript设计模式----单例模式

    声明:这个系列为阅读<JavaScript设计模式与开发实践> --曾探@著一书的读书笔记 1.单例模式的特点和定义 保证一个类仅有一个实例,并且提供一个访问它的全局访问点. 2.传统面向 ...

  3. javascript设计模式--单例模式

    什么是单例模式 单例就是保证一个类只有一个实例,实现的方法一般是先判断实例存在与否,如果存在直接返回,如果不存在就创建了再返回,这就确保了一个类只有一个实例对象.在JavaScript里,单例作为一个 ...

  4. javascript设计模式-单例模式(singleton pattern)

    为什么80%的码农都做不了架构师?>>>    最简单的单例模式 var mySingleton = {property1: "something",proper ...

  5. JavaScript设计模式——单例模式

    单例模式 单例模式顾名思义就是只生成一个实例对象的一种模式.无论调用多少次都只返回相同的实例. 当我们单击登录按钮的时候,页面中会出现一个登录浮窗,而这个登录浮窗是唯一的,无论单击多少次登录按钮,这个 ...

  6. JavaScript 设计模式核⼼原理与应⽤实践之单例模式——Vuex的数据管理哲学

    JavaScript 设计模式核⼼原理与应⽤实践之单例模式--Vuex的数据管理哲学 保证一个类仅有一个实例,并提供一个访问它的全局访问点,这样的模式就叫做单例模式. 单例模式的实现思路 思考这样一个 ...

  7. Javascript设计模式之单例模式

    前言:菜鸡也有梦想,而我的梦想就是进一个真正的互联网大厂.以前学习的时候没有系统的整理,从今天开始要保持每周写博客的习惯,希望自己可以有所成长.为了培养编程思维,决定从设计模式开始写起.我是通过读&l ...

  8. JavaScript设计模式与开发实践系列之单例模式

    本系列为<JavaScript设计模式与开发实践>(作者:曾探)学习总结,如想深入了解,请支持作者原版 单例模式 实现单例模式 单例模式的定义是:保证一个类仅有一个实例,并提供一个访问它的 ...

  9. JavaScript设计模式与开发实践 - 单例模式

    引言 本文摘自<JavaScript设计模式与开发实践> 在传统开发工程师眼里,单例就是保证一个类只有一个实例,实现的方法一般是先判断实例存在与否,如果存在直接返回,如果不存在就创建了再返 ...

最新文章

  1. 蝴蝶扇了一下翅膀,混沌就诞生了
  2. linux c fopen open 互相转换 文件指针 到 文件描述符 FILE* 转 FD
  3. SQL Prompt 5.1使用
  4. gmr 通信 matlab,matlab使用TCP/IP Server Sockets
  5. 解决mac下webstorm编辑器识别less的问题
  6. 11g RAC OCR,VOTING DISK存储全部损坏,利用自动备份,恢复OCR,VOTING DISK到新存储。...
  7. mysql 创建用户权限_10.创建 MySQL 用户及赋予用户权限
  8. QT 的基础调试技巧 -- 未完 -- 更新中
  9. java存款输入密码类,创建一个银行账户类,包括账号、用户姓名、密码和余额属性,实现开户、查询余额、取款、存款功能。...
  10. Proliant server setup redhat7.1(DL560)
  11. 网络管理与维护作业13
  12. tuxedo服务端访问oracle,tuxedo9.1与oracle10g互联
  13. 学做智能车--电磁探究篇
  14. GRPC Connection Backoff Protocol
  15. 原来普洱茶还有预防头痛,减轻体重,缓解压力和失眠的作用,而且是年份久的普洱茶效果好
  16. 领导的沉默,背后到底隐藏着什么?
  17. 手机触屏事件(jquery)
  18. 英语考研语法--什么是英语句子?(刘晓艳--不就是语法和长难句吗)
  19. centons7安装docker私有库harbor
  20. OpenCV每日函数 专栏简述(陆续整理中)

热门文章

  1. 从零学ELK系列(二):VMware安装Centos(超详细图文教程)
  2. 搜狗AI,正在抢滩智能手机
  3. Nuro发布自家自动驾驶安全报告,提出无人车12大安全要素 | 报告下载
  4. 密集人体姿态估计:2D图像帧可实时生成UV贴图(附论文)
  5. 如何提取sql语句中绑定变量的值?
  6. 基于HFC实现10Gbps对称数据传输
  7. .net mvc web api 返回 json 内容,过滤值为null的属性
  8. Go 1.5交叉编译
  9. 安全上下文以及FACL
  10. 企业呼吁更多关注网络安全