單例模式的定義:確保一個實例,並提供全局訪問。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, }; };