javascript设计模式学习之四——单例模式,缓存与对象池
单例模式的定义:确保一个实例,并提供全局访问。
惰性单例的定义:只在需要的时候才创建对象。
在开发中,有些对象往往只需要一个,比如线程池、全局缓存、浏览器中的window对象等。
java中的单例
关键在于使用一个变量来标志当前是否为某个类创建过对象。
public class Singleton {
private Singleton() {}
private static Singleton single=null;
//静态工厂方法
public static Singleton getInstance() {
if (single == null) {
single = new Singleton();
}
return single;
}
}
这样的单例类有一定的“不透明性”,其使用者必须知道这是一个单例类,不能通过New xxx的方式创建实例,而是需要使用Singleton.getInstance方法来获取对象。
javascript中的单例模式
根据单例模式的特点:1)只有一个实例,2)对外提供全局访问;
1)javascript中的全局对象自变量无疑符合单例的特征,但其缺点是不可避免会有全局污染的问题;
2)下面是一种通用的惰性单例的实现方法
document.addEventListener('DOMContentLoaded',function(){
//getSingle是创建单例通用的方法
var getSingle=function(fn){
var ret;
return function(){
return ret||(ret=fn.apply(this,arguments));
};
};
//下面以创建唯一的登陆浮窗为例
var createLoginLayer=function(){
var div=document.createElement('div');
div.innerHTML='我是登陆浮窗';
document.body.appendChild(div);
return div;
};
var getSingleLoginLayer=getSingle(createLoginLayer);
var div1=getSingleLoginLayer();
var div2=getSingleLoginLayer();
console.log(div1===div2); //输出true
},false);
变量缓存
如果ret不是基本变量,而是一个对象,则可以用来实现缓存,在jQuery的源代码中有很多这样的例子。
var cache={};//一般定义为一个全局变量
var tmp=cache[key]||fn(key);
对象池
对象池维护一个装载着空闲对象的池子,如果需要对象的时候,不是直接new,而是从对象池中取出,如果对象池中没有空闲对象,则新建一个空闲对象。对象池技术的使用非常广泛,http连接池和数据库连接池都是其代表。在web前端中,对象池使用最多的使得DOM有关的操作。
对象池的实现:
//对象池
var objectPoolFactory=function(createObjFn){
var pool=[],
create=function(){
var obj=pool.length>?pool.shift():createObjFn.apply(this,arguments);
return obj;
},
recover=function(obj){
pool.push(obj);
};
return {
create:create,
recover:recover,
};
};
javascript设计模式学习之四——单例模式,缓存与对象池的更多相关文章
- JavaScript设计模式学习之单例模式
一.单例模式介绍 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问, ...
- C#设计模式学习笔记-单例模式随笔
最近学习 设计模式,从单例模式入手 啥是单例模式: 要实现一个单例类的话,首先,肯定是不能让用户自行生产的,那就是说明不能让用户new,所以,就必须把构造函数设置成为私有的 因为静态变量的生命周期跟整 ...
- C#设计模式学习笔记-单例模式(转)
C#设计模式学习笔记-单例模式 http://www.cnblogs.com/xun126/archive/2011/03/09/1970807.html 最近在学设计模式,学到创建型模式的时候,碰到 ...
- javascript设计模式学习之十二——享元模式
一.享元模式的定义及使用场景 享元模式是为了解决性能问题而诞生的设计模式,这和大部分设计模式为了提高程序复用性的原因不太一样,如果系统中因为创建了大量类似对象而导致内存占用过高,享元模式就非常有用了. ...
- Javascript设计模式学习一
学习Javascript设计模式之前,需要先了解一些相关知识,面向对象的基础知识.this等重要概念,以及掌握一些函数式编程的技巧. Js多态 多态的思想:实际上是把“做什么”和“谁去做”分离开来.例 ...
- 【Javascript设计模式1】-单例模式
<parctical common lisp>的作者曾说,如果你需要一种模式,那一定是哪里出了问题.他所说的问题是指因为语言的天生缺陷,不得不去寻求和总结一种通用的解决方案. 不管是弱类型 ...
- JavaScript设计模式学习之路——面向对象的思想
今天,我拿到了张容铭写的这本<JavaScript设计模式>这本书,开始了关于JavaScript更深一点的学习. 看到这本书开始的时候,虽然之前通过看书.一些比较好的视频的讲解,对Jav ...
- JavaScript设计模式学习笔记
1 JavaScript设计模式深入分析 私有属性和方法:函数有作用域,在函数内用var 关键字声明的变量在外部无法访问,私有属性和方法本质就是你希望在对象外部无法访问的变量. 特权属性和方法:创建属 ...
- JavaScript设计模式 Item 6 --单例模式Singleton
单例模式的定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 单例模式是一种常用的模式,有一些对象我们往往只需要一个,比如线程池.全局缓存.浏览器的window对象.在js开发中,单例模式的 ...
随机推荐
- Eclipse学习记录
设置背景色:http://jingyan.baidu.com/article/2a138328b5d9ea074a134fc7.html 项目文件说明:http://www.cnblogs.com/p ...
- Ubuntu下关闭apache和mysql的开机启动
Ubuntu下关闭apache和mysql的开机启动 sudo apt-get install sysv-rc-conf sudo sysv-rc-conf sudo vi /etc/init/mys ...
- CodeForces 625B 字符串模拟+思维
题意 给出字符串a与b 可以将a中的单个字符改为# 问最少改多少次 a中就找不到b了 一开始想的是用strstr 因为如果找到 可以将strstr(a,b)-a+1改成# 即改首字母 用while循环 ...
- 为Ubuntu Server安装gnome图形桌面环境
Ubuntu Server版默认都没有图形桌面(GUI),但是可以安装,以下共有两种安装方法. 一.安装全部Gnome桌面环境 Ubuntu系列桌面实际上有几种桌面应用程序,包括Ubuntu-desk ...
- TCP/IP简介
TCP/IP协议分层 提到协议分层,我们很容易联想到ISO-OSI的七层协议经典架构,但是TCP/IP协议族的结构则稍有不同.如图所示 TCP/IP协议族按照层次由上到下,层层包装.最上面的就是应用层 ...
- Web--RSS
--用处:SEO,让别人订阅你的文章
- LR中HTTP协议录制模式选择
在LR中使用HTML/HTTP协议进行脚本录制时面临正确选择HTTP-based script / URL-base script 录制模式的问题,以下是比较官方的建议:1)基于浏览器的应用程序推荐使 ...
- Law of total probability
https://en.wikipedia.org/wiki/Law_of_total_probability the total probability of an outcome which can ...
- How Browsers Work: Behind the scenes of modern web browsers
http://www.html5rocks.com/en/tutorials/internals/howbrowserswork/#Parser_Lexer_combination Grammars ...
- mysql storage enginees
这段时间在看<High Performance MySQL>,看到存储引擎这个地方感到很多细节比较陌生,所以总结小记一些 为 了适应各种不同的运行环境,MYSQL提供了多种不同的存储引擎( ...