单例模式的定义:确保一个实例,并提供全局访问。javascript
惰性单例的定义:只在须要的时候才建立对象。前端
在开发中,有些对象每每只须要一个,好比线程池、全局缓存、浏览器中的window对象等。java
java中的单例web
关键在于使用一个变量来标志当前是否为某个类建立过对象。数据库
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)对外提供全局访问;app
1)javascript中的全局对象自变量无疑符合单例的特征,但其缺点是不可避免会有全局污染的问题;this
2)下面是一种通用的惰性单例的实现方法spa
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>0?pool.shift():createObjFn.apply(this,arguments); return obj; }, recover=function(obj){ pool.push(obj); }; return { create:create, recover:recover, }; };