摘要:單例模式的定義是保證一個類只有僅有一個實例,并提供一個訪問它的全局訪問點。并且按照單一職責原則類實現功能類管理單例管理單例模式,達到可組合的的效果創建普通類引入代理類惰性單例模式分離創建實例對象的職責與管理單例的職責。
單例模式的定義是:保證一個類只有僅有一個實例,并提供一個訪問它的全局訪問點。
單例模式是一種常用的模式,有些對象我們往往只需要一個,比如線程池,全局緩存,window對象。
簡單單例模式要實現一個單例模式并不復雜,無非是用一個變量來標志當前是否已經為某個類創建過對象,如果是,則在下一次獲取該類的時候,直接返回之前創建的對象。
var Singleton = function(name) { this.name = name this.instance = null } Singleton.prototype.getName = function() { alert(this.name) } Singleton.getInstance = function(name) { if (!this.instance) { this.instance = new Singleton(name) } return this.instance } var a = Singleton.getInstance("sven1") var b = Singleton.getInstance("sven2") alert(a===b) // true
通過Singleton.getInstance來獲取Singleton類的唯一對象,這種方式相對簡單,但有問題,使用者并不知道這是一個單例類
用代理實現的單例模式我們現在的目標是實現一個透明的單例類,用戶從這個類中獲取對象的時候,可以像使用其他普通類一樣。并且按照單一職責原則,createDiv類實現功能,proxySingletonCreateDiv類管理單例管理單例模式,達到可組合的的效果
// 創建普通類 var CreateDiv = function(html){ this.html = html this.init() } CreateDiv.prototype.init = function() { var div = document.createComment("div") div.innerHTML = this.html document.body.appendChild(div) } //引入代理類 var proxySingletonCreateDiv = (function() { var instance return function(html) { if (!instance) { instance = new CreateDiv(html) } return instance } })() var a = new proxySingletonCreateDiv("sven1") var b = new proxySingletonCreateDiv("sven2") alert(a===b) // true惰性單例模式
分離創建實例對象的職責與管理單例的職責。下面用創建一個登陸框舉例
// 管理單例 var getSingle = function(fn) { var result return function() { return result || (result= fn.apply(this, arguments)) } } var createLoginLayer = function() { var div = document.createElement("div") div.innerHTML = "我是登陸浮窗" div.style.display = "none" document.body.appendChild(div) return div } var createSingleLoginLayer = getSingle(createLoginLayer) document.getElementById("loginBtn").onclick = function(){ var loginLayer = createSingleLoginLayer() loginLayer.style.display = "block" }
單例模式是一種簡單但非常使用的技術,特別是惰性單例技術,在合適的時候才創建對象,并且至創建唯一的一個。更奇妙的是,創建對象和管理單例的職責被分布在兩個不同的方法中,這兩個方法組合起來才具有單例模式的威力。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/99161.html
摘要:代理模式代理模式為一個對象提供一個代用品或占位符,以便控制對于它訪問。這種代理就叫虛擬代理。保護代理用于對象應該有不同訪問權限情況。寫時復制代理時虛擬代理的一種變體。 一、創建型設計模式(三大類設計模式) 創建型設計模式 --創建說明該類別里面的設計模式就是用來創建對象的,也就是在不同的場景下我們應該選用什么樣的方式來創建對象。 1. 單例模式 ==單例模式(Singleton)==:...
摘要:但是,這并不是采用單例的唯一原因。使用命名空間單例模式也被稱為模塊設計模式。函數內部聲明了一些局部函數和或變量。緊隨函數聲明放置即可立即執行外部函數,并將所得的對象文字費賠給變量。 JavaScript設計模式-第一部分:單例模式、組合模式和外觀模式 設計模式是一些可靠的編程方式,有助于保證代碼更加易于維護、擴展及分離,所有設計模式在創建大型JavaScript應用程序時均不可或缺 單...
摘要:此時我們創建的對象內保存靜態變量通過取值器訪問,最后將這個對象作為一個單例放在全局空間里面作為靜態變量單例對象供他人使用。 單例模式 又被稱為單體模式,是只允許實例化一次的對象類。有時我們也用一個對象來規劃一個命名空間,井井有條的管理對象上面的屬性和方法。 傳統的面向對象語言中單例模式的實現,均是單例對象從類中創建而來,在以類為中心的語言中,這是很常見的做法。如果需要某個對象,就必須先...
摘要:不符合設計模式中的單一職責的概念。引入代理實現單例模式引入代理實現單例模式的特點我們負責管理單例的邏輯移到了代理類中。的單例模式對比在以上的代碼中實現的單例模式都混入了傳統面向對象語言的特點。 聲明:這個系列為閱讀《JavaScript設計模式與開發實踐》 ----曾探@著一書的讀書筆記 1.單例模式的特點和定義 保證一個類僅有一個實例,并且提供一個訪問它的全局訪問點。 2.傳統面向對...
摘要:停更許久,近期計劃更新設計模式系列。單例模式是創建型設計模式的一種。雖然它不是正規的單例模式,但不可否認確實具備類單例模式的特點。適用場景單例模式的特點,意圖解決維護一個全局實例對象。 停更許久,近期計劃更新:設計模式系列。 showImg(https://segmentfault.com/img/bVbt7uw?w=800&h=600); 單例模式:限制類實例化次數只能一次,一個類只...
閱讀 1830·2021-11-11 16:54
閱讀 2057·2019-08-30 15:56
閱讀 2365·2019-08-30 15:44
閱讀 1282·2019-08-30 15:43
閱讀 1856·2019-08-30 11:07
閱讀 812·2019-08-29 17:11
閱讀 1464·2019-08-29 15:23
閱讀 3007·2019-08-29 13:01