首先我们对单例模式先进行理论上的讲解,接下来,我们再通过具体的代码示例,来讲解,这个单例模式的使用场景和这种模式的优缺点

(这个系列的所有关于设计模式的都是面向Javascript)

一、理论定义:

    单例模式  --- 保证一个类仅有一个实例,并提供一个访问它的全局访问点 (是不是有点懵逼了,其实我第一次看到这句话的时候也是懵逼的,继续往下看呗)

二、话不多说直接上一个最简单的单例模式的代码:

	var SingleDog = function(name){				//创建构造函数
this.name = name;
this.instance = null;
} SingleDog.prototype.getName = function(){ //SingleDog对象获取当前name方法
return this.name;
} SingleDog.getInstance = function(name){ //获取实例化方法
if(!this.instance){
this.instance = new SingleDog(name);
}
return this.instance;
} var a = SingleDog.getInstance('Zigzag'); //实例化 并将结果对象 赋值给a
var b = SingleDog.getInstance('Bing'); //实例化 并将结果对象 赋值给b console.log(a.getName()); //这个大家一看很明显就知道了(Zigzag)
console.log(b.getName()); //这个 呢? console.log(a === b); // true
今天先写这么多吧,明天回来继续
回来继续~

二、上面的代码,通过长时间的阅读和理解。其实就是在 实例化的过程中,我们去改变一个我们事先定义好的变量值,从而达到控制且只有一个单例的目的。

接下来,我们再看一段,我们开发过程中应用的更多的有一些实际作用的代码。

/*
*功能: 实现点击显示或者创建一个 浮层(div)
*对比: 这里会写 两种方法 来实现这个需求
*/
1、第一种就是我们 常常使用的  display 的方法。
<button id="login">登陆</button>
	var loginlayer = (function(){
var div = document.createElement('div');
div.innerHTML = "我的登陆浮层";
div.style.display = 'none';
document.body.appendChild(div);
return div;
})(); document.getElementById('login').onclick = function(){
loginlayer.style.display = 'block';
}
虽然这种方法我们常常用,而且也实现了我们想要的需求,但是,在页面一被加载的时候就 创建了一些 DOM 这样是不可取的。 因为浪费。(太洁癖了吧)
2、第二种方法来实现这个需求, 我们一步步来优化这段代码。
	var loginlayer = function(){
var div = document.createElement('div');
div.innerHTML = "我的登陆浮层";
div.style.display = 'none';
document.body.appendChild(div);
return div;
}; document.getElementById('login').onclick = function(){
var loginlayers = loginlayer();
loginlayer.style.display = 'block';
}
//这样的话,我们是不是只有在用户去点击 btn 的时候,我们才会去创建我们的DOM 。
// 虽然需求是 实现了,但是并木有用到我们的 单例模式。并且如果我们点击关闭并删除这个layer 的话,这样频繁的创建和删除节点明显也是不合理的。
//(但是这里切记,我们只是为了学习单例模式才去,进行下一步的 优化,学习设计模式是为了学习这些模式的思想,而不是为了去 生搬硬套这些代码。)
3、第三种方法来实现这个需求,使用我们的 单例模式来实现这个需求,大家可以先别看下面的代码, 先想一想怎么去构建自己的代码来实现单例模式。
	var Createloginlayer = function(){
var div;
return function(){
if(!div){
var div = document.createElement('div');
div.innerHTML = "我的登陆浮层";
div.style.display = 'none';
document.body.appendChild(div);
}
return div;
}
}; document.getElementById('login').onclick = function(){
var loginlayers = Createloginlayer();
loginlayer.style.display = 'block';
}

看完第三种 实现这个需求的代码之后会不会觉的 很高大上,而且也很合理。

这里我们就是应用了单例模式的 一个 特性,即: 我们用了一个变量来判断时候已经创建了我们的节点,这样在重复这些操作的时候,我们可以仅仅只创建一次节点。

这里就是我们 常常会用到的 ##惰性单利模式。

今天就到这里了,明天继续~ 明天会写一些 通用的 惰性单例.

第一章 --- 关于Javascript 设计模式 之 单例模式的更多相关文章

  1. JavaScript设计模式之单例模式【惰性单例】

    在提高开发水平,往中高级前端工程师中,利用设计模式是必不可少的一条道路.掌握设计模式的思想远远比硬套重要,因为设计模式是一种思想,不局限于开发语言.但实际上由于语言的特性不同,往往在实现的时候会有不少 ...

  2. 《JavaScript高级程序设计(第3版)》阅读总结记录第一章之JavaScript简介

    前言: 为什么会想到把<JavaScript 高级程序设计(第 3 版)>总结记录呢,之前写过一篇博客,研究的轮播效果,后来又去看了<JavaScript 高级程序设计(第3版)&g ...

  3. 第一章:Javascript语言核心

    本节是javascript语言的一个快速预览,也是本书的第一部分快速预览. 读此书之前,感谢淘宝技术团队对此javascript核心的翻译,感谢弗拉纳根写出此书.感谢你们无私的分享,仅以此笔记献给你们 ...

  4. JavaScript DOM编程艺术第一章:JavaScript简史

    本系列的博客是由本人在阅读<JavaScript DOM编程艺术>一书过程中做的总结.前面的偏理论部分都是书中原话,觉得有必要记录下来,方便自己翻阅,也希望能为读到本博客的人提供一些帮助, ...

  5. 第一章 引言--《设计模式-可复用面向对象软件的基础》Erich Gamma

    第一章 引言 本章主要是让我们大致明白设计模式是干嘛用的,模式分类,设计模式如何解决设计问题以及几种常见的面向对象设计中软件的复用方法. 1.什么是设计模式? 个人理解概括,设计模式是对一类问题的抽象 ...

  6. JavaScript设计模式_01_单例模式

    最近项目不太忙,难得有时间看看书,平时挺喜欢js这门语言.也看过很多高级教程,觉得自己还是比较热衷于js的设计模式.这一次重温一下<JavaScript设计模式与开发实践>,开篇为单例模式 ...

  7. 再起航,我的学习笔记之JavaScript设计模式10(单例模式)

    单例模式 单例模式(Singleton) : 又被称为单体模式,是只允许实例化一次的对象类.一个类有且仅有一个实例,并且自行实例化向整个系统提供. 命名空间 单例模式可能是JavaScript中我们最 ...

  8. 为什么我要放弃javaScript数据结构与算法(第一章)—— JavaScript简介

    数据结构与算法一直是我算比较薄弱的地方,希望通过阅读<javaScript数据结构与算法>可以有所改变,我相信接下来的记录不单单对于我自己有帮助,也可以帮助到一些这方面的小白,接下来让我们 ...

  9. [JavaScript设计模式]惰性单例模式

    惰性单例模式 之前介绍了JS中类的单例模式,这次我们讨论下单例模式的应用.在众多网站中,登录框的实现方式就是一个单例,点击一次就展示一次,所以我们可以在页面加载好的时候就创建一个登录框,点击页面上的登 ...

随机推荐

  1. rsync同步架构

    1.1 rsync服务器端配置 1.1.1 查看服务器端rsync版本 1.1.2 创建配置文件 默认安装好rsync程序后,并不会自动创建rsync的主配置文件,需要手工来创建,其主配置文件为“/e ...

  2. IT技术思维导图

    在网上看到有个人总结的java技术的东东,觉得很好,就保存下来了,码农还真是累啊,只有不断的学习才能有所提高,才能拿更多的RMB啊. java技术思维导图 服务端思维导图 前端思维导图

  3. Jmeter+TCP\Scoket(8583)报文压力测试

    Jmeter一般被用来测试HTTP协议,我第一次拿来测试socket协议,pos机传输报文为8583,协议属于socket,也是TCP协议的一种,网上有LR怎么测试8583报文,我就研究了一下怎么用J ...

  4. kettle中全局变量的设置

    设置全局变量. 找到.properties文件: 在文件中设置值: 在kettle中新建一个job(不用做任何设置): 转换中获取便元的设置: 重启kettle的执行结果:

  5. JAVA中使用FTPClient实现文件上传下载实例代码

    一.上传文件 原理就不介绍了,大家直接看代码吧 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 ...

  6. 分享基于EF+MVC+Bootstrap的通用后台管理系统及架构

      基于EF+MVC+Bootstrap构建通用后台管理系统,集成轻量级的缓存模块.日志模块.上传缩略图模块.通用配置及服务调用, 提供了OA.CRM.CMS的原型实例,适合快速构建中小型互联网及行业 ...

  7. laravel实现数据库多库配置,读写分离配置或者多读写分离配置

    'connections' => array( //默认mysql配置,访问test库 'mysql' => array( 'driver' => 'mysql', 'host' = ...

  8. linux的常用文件系统格式

    文件系统指文件存在的物理空间.在Linux系统中,每个分区都是一个文件系统,都有自己的目录层次结构.Linux的最重要特征之一就是支持多种文件系统,这样它更加灵活,并可以和许多其它种操作系统共存.Vi ...

  9. SpringMVC注解汇总(二)-请求映射规则

    接上一节SpringMVC注解汇总-定义 讲到Httpy请求信息 URL路径映射 1)普通URL路径映射 @RequestMapping(value={"/test1", &quo ...

  10. 常用的shell脚本

    [root@WEB1-live sh]# cat licai_fabu.sh #!/bin/bash pid=` ps -ef | grep java | grep '8011' | awk '{pr ...