定義:保證一個對象(類)僅有一個實例,並提供一個訪問它的全局訪問點;
實現原理:利用閉包來保持對一個局部變量的引用,這個變量保存著首次創建的唯一的實例;
主要用於:全局緩存、登錄浮窗等只需要唯一一個實例的時候;
一. 為一個非單例模式對象(如:Demo)實現單例模式的方法:
給Demo添加一個靜態方法來實現單例:
Demo.getSingle = (function(){ var demo = null; return function(name){ if(!demo){ demo = new Demo(name); } return demo; } })();
用法:
非單例模式:var a = new Demo('Peter');
單例模式:
var b1 = Demo.getSingle('Peter'); var b2 = Demo.getSingle('Sufei'); b1 === b2;//true,都引用的是new Demo('Peter')
通過代理類來實現單例:
var ProxyDemo = (function(){ var demo = null; return function(name){ if(!demo){ demo = new Demo(name); } return demo; } })();
用法:
非單例模式:var a = new Demo('Peter');
單例模式:var b = new ProxyDemo('Peter');
二. 惰性單例模式:只在需要的時候才創建該單例;
以下是通用惰性單例的創建方法:
var getSingle = function(foo){ var single = null; return function(){ return single || (single = foo.apply(this,arguments)); } };
用法:
var createLoginLayer = function(){ var frag = document.createDocumentFragment(); var div = document.createElement('div'); div.style.display = 'none'; //以下給div添加其它登錄元素 ... document.body.appendChild(frag.appendChild(div)); return div; } var createSingleLoginLayer = getSingle(createLoginLayer); //當用戶第一次點擊按鈕(id = 'lgBtn')時,來創建並顯示登錄窗口,之後重復點擊按鈕不會重復創建; document.getElementById('lgBtn').onclick = function(){ var lg = createSingleLoginLayer(); lg.style.display = 'block'; }
附:緩存函數的計算結果,如計算一個數的數列
以下是不緩存的寫法,非常慢!
function foo(n){ results = n < 2 ? n : foo(n - 1) + foo(n - 2); return results; } console.log(foo(40));//得計算好幾秒
以下是緩存寫法,基本瞬間出結果!
var cache = {}; function foo(n){ if(!cache[n]){ cache[n] = n < 2 ? n : foo(n - 1) + foo(n - 2); } return cache[n]; } console.log(foo(100));
更好的寫法:
var foo = (function(){ var cache = {}; return function(n){ if(!cache[n]){ cache[n] = n < 2 ? n : foo(n - 1) + foo(n - 2); } return cache[n]; }; })(); console.log(foo(100));
參考文獻:
《JavaScript模式》
《JavaScript設計模式與開發實踐》
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持。