摘要:單例模式定義保證一個類只有一個實例,并提供一個訪問它的全局訪問點。或者使用類時,我們必須知道它是一個單例類,跟以往出一個新對象的方式不同,這里要使用來獲取對象。
單例模式 定義: 保證一個類只有一個實例,并提供一個訪問它的全局訪問點。
var single = function(name){ this.name = name; this.instance = null; } single.prototype.getName = function(){ alert(this.name) } single.getInstance = function(name){ if(!this.instance){ this.instance = new single(name) } return this.instance } var a = new single.getInstance("ffff"); var a2 = new single.getInstance("zzzz"); // a == a2 => true
或者
var single = function(name){ this.name = name; } single.prototype.getName = function(){ console.log(this.name) } single.getInstance = (function(){ var instance = null; return function(name){ if(!instance){ instance = new single(name) } return isntance } })()
使用single類時,我們必須知道它是一個單例類,跟以往new出一個新對象的方式不同,這里要使用single.getInstance來獲取對象。
透明的單例var createDiv = (function(){ var instance = null; var createDiv = function(html){ if(instance) return instance this.html = html; this.init() return instance = this; } createDiv.prototype.init = function(){ var div = document.createElement("div") div.innerHTML = this.html; document.body.appendChild(div) } return createDiv })()
這個透明類的單例,我們使用了自執行函數和閉包,并且讓這個匿名函數返回真正的single構造方法,增加了代碼的復雜度,讀起來需要一定的時間來理解
構造函數的作用,實際上做了兩件事,創建對象和執行初始化init方法,第二保證了只有一個對象
用代理來實現單例模式var createDiv = function(html){ this.html = html; this.init(); } createDiv.prototype.init = function(){ var div = document.createElement("div"); div.innerHTML = this.html; document.body.appendChild(div); }
引入代理類
var proxySingle = (function(){ var instance; return function(html){ if(!instance){ instance = new createDiv(html) } return instance } })()
通過代理模式完成的代碼,我把管理單例的邏輯移到了proxySingle里,這樣createDiv就變成了一個普通的類
這個例子是緩存代理的應用之一。
惰性單例惰性單例指的是在需要的時候才創建對象實例。
這種技術在實際開發中非常有用。
在網站首頁,有個登陸按鈕,點擊登錄 彈出登錄框。很明顯這個登錄框在頁面中是唯一的,不會也不可能出現兩個登陸框。
首先我們可以頁面加載完成時就加載這個登錄框,此時這個登錄框出于隱藏狀態。
但是如果我進入頁面只是想看看,不想進行一些需要登陸的業務操作,此時登陸框的dom節點存在是沒有意義的,是一種浪費。
此時,單例模式就更實用了
//dom //js var createLogin = (function(){ var div; return function(){ if(!div){ div= document.createElement("div"); div.innerHTML = "i"m login form"; div.display.style="none"; document.body.appendChild(div); return div } } })() document.getElementById("login").onClick = function(){ var loginDom = createLogin(); loginDom.display.style ="block" }通用惰性單例
我們參考上邊的代碼,如果需要在創建一個iframe單例,或者其他標簽,難道需要把上邊的函數重新copy一份修改.單例的邏輯可以抽象出來,并且始終不變的,可以理解為
var instance; if(!instance){ instance = xxx操作 } return instance
我們將管理單例的邏輯抽象封裝起來getInstance
var getInstance = function(fn){ var instance; return function(){ return instance || (result = fn.apply(this,arguments)) } } //創建登陸 var createLogin = getInstance(function(){ var div = document.createElement("div"); div.innerHTML = "我是的登陸"; div.style.display = "none"; document.body.appenChild(div); return div }) // $("#login").on("click",function(){ var login = createLogin(); $(login).show() }) //創建script var createScript = getInstance(function(){ var script = document.createElement("script"); document.appendChild(script) return script }) $("#loadScript").on("click",function(){ var script = createScript(); $(script).show(); })
將創建實例對象的職責和管理單例的職責分別放置在兩個方法里,這兩個方法獨立,不會互相影響。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/80736.html
摘要:總結單例是運用頻率很高的模式,因為客戶端沒有高并發的情況,選擇哪種方式并不會有太大的影響,出于效率考慮,推薦使用和靜態內部類實現單例模式。 單例模式介紹 單例模式是應用最廣的模式之一,也可能是很多人唯一會使用的設計模式。在應用單例模式時,單例對象的類必須保證只用一個實例存在。許多時候整個系統只需要一個全局對象,這樣有利于我么能協調整個系統整體的行為。 單例模式的使用場景 確保某個類有且...
摘要:不符合設計模式中的單一職責的概念。引入代理實現單例模式引入代理實現單例模式的特點我們負責管理單例的邏輯移到了代理類中。的單例模式對比在以上的代碼中實現的單例模式都混入了傳統面向對象語言的特點。 聲明:這個系列為閱讀《JavaScript設計模式與開發實踐》 ----曾探@著一書的讀書筆記 1.單例模式的特點和定義 保證一個類僅有一個實例,并且提供一個訪問它的全局訪問點。 2.傳統面向對...
摘要:如果需要防范這種攻擊,請修改構造函數,使其在被要求創建第二個實例時拋出異常。單例模式與單一職責原則有沖突。源碼地址參考文獻設計模式之禪 定義 單例模式是一個比較簡單的模式,其定義如下: 保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。 或者 Ensure a class has only one instance, and provide a global point of ac...
摘要:在設計模式一書中,將單例模式稱作單件模式。通過關鍵字,來保證不會同時有兩個線程進入該方法的實例對象改善多線程問題為了符合大多數程序,很明顯地,我們需要確保單例模式能在多線程的情況下正常工作。 在《Head First 設計模式》一書中,將單例模式稱作單件模式。這里為了適應大環境,把它稱之為大家更熟悉的單例模式。 一、了解單例模式 1.1 什么是單例模式 單例模式確保一個類只有一個實例,...
閱讀 2048·2019-08-30 15:52
閱讀 2440·2019-08-29 18:37
閱讀 790·2019-08-29 12:33
閱讀 2839·2019-08-29 11:04
閱讀 1523·2019-08-27 10:57
閱讀 2092·2019-08-26 13:38
閱讀 2759·2019-08-26 12:25
閱讀 2445·2019-08-26 12:23