摘要:?jiǎn)卫J絾卫J骄褪潜WC一個(gè)類僅有一個(gè)實(shí)例并提供一個(gè)訪問(wèn)它的全局訪問(wèn)點(diǎn)其最大的特點(diǎn)就是永遠(yuǎn)只返回一個(gè)實(shí)例實(shí)例通過(guò)來(lái)獲取類的唯一對(duì)象其缺點(diǎn)也明顯增加了類的不透明性透明的單例模式最終會(huì)被返回使用代理實(shí)現(xiàn)單例模式將負(fù)責(zé)管理單例的邏輯移到了代理類中
單例模式
單例模式 就是保證一個(gè)類僅有一個(gè)實(shí)例, 并提供一個(gè)訪問(wèn)它的全局訪問(wèn)點(diǎn).
其最大的特點(diǎn)就是 永遠(yuǎn)只返回一個(gè)實(shí)例
var Singleton = function (name) { this.name = name; // instance 實(shí)例 this.instance = null; }; Singleton.prototype.getName = function () { console.log(this.name); }; // 通過(guò)queryInstance 來(lái)獲取 Singleton 類的唯一對(duì)象 Singleton.queryInstance = function (name) { if (!this.instance) { this.instance = new Singleton(name) } return this.instance; } var a = Singleton.queryInstance("a"); var b = Singleton.queryInstance("b"); console.log(a); // {name: "a", instance: null} console.log(b); // {name: "a", instance: null} console.log(a === b); // true
其缺點(diǎn)也明顯, 增加了 類的 不透明性
透明的單例模式var CreateDiv = (function () { var instance; // CreateDiv 最終會(huì)被返回 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; })(); var a = new CreateDiv("a"); var b = new CreateDiv("b"); console.log(a); console.log(b); console.log(a === b);使用代理實(shí)現(xiàn)單例模式
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); } // 將負(fù)責(zé)管理單例的邏輯移到了代理類中. // 這樣CreateDiv 就變成了一個(gè)普通的類 var ProxySingletonCreateDiv = (function () { var instance; return function (html) { if (!instance) { instance = new CreateDiv(html); } return instance; } })(); var a = new ProxySingletonCreateDiv("a"); var b = new ProxySingletonCreateDiv("b");惰性單例
在需要的時(shí)候才創(chuàng)建對(duì)象實(shí)例
// 這個(gè)函數(shù)就是創(chuàng)建一個(gè) 通用的惰性單例模式 var getSingle = function (fn) { var result; return function () { return result || (result = fn.apply(this, arguments)) } }; // 以下的都是實(shí)例對(duì)象的 職責(zé). 將兩種區(qū)分開(kāi)來(lái) 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"; }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/102525.html
摘要:最近開(kāi)展了三次設(shè)計(jì)模式的公開(kāi)課,現(xiàn)在來(lái)總結(jié)一下設(shè)計(jì)模式在中的應(yīng)用,這是第一篇?jiǎng)?chuàng)建型模式之單例模式。不過(guò)因?yàn)椴恢С侄嗑€程所以不需要考慮這個(gè)問(wèn)題了。 最近開(kāi)展了三次設(shè)計(jì)模式的公開(kāi)課,現(xiàn)在來(lái)總結(jié)一下設(shè)計(jì)模式在PHP中的應(yīng)用,這是第一篇?jiǎng)?chuàng)建型模式之單例模式。 一、設(shè)計(jì)模式簡(jiǎn)介 首先我們來(lái)認(rèn)識(shí)一下什么是設(shè)計(jì)模式: 設(shè)計(jì)模式是一套被反復(fù)使用、容易被他人理解的、可靠的代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)。 設(shè)計(jì)模式不...
摘要:原文博客地址單例模式系統(tǒng)中被唯一使用,一個(gè)類只有一個(gè)實(shí)例。中的單例模式利用閉包實(shí)現(xiàn)了私有變量?jī)烧呤欠裣嗟热躅愋?,沒(méi)有私有方法,使用者還是可以直接一個(gè),也會(huì)有方法分割線不是單例最簡(jiǎn)單的單例模式,就是對(duì)象。 原文博客地址:https://finget.github.io/2018/11/06/single/ 單例模式 系統(tǒng)中被唯一使用,一個(gè)類只有一個(gè)實(shí)例。實(shí)現(xiàn)方法一般是先判斷實(shí)例是否存在,...
摘要:本系列為設(shè)計(jì)模式與開(kāi)發(fā)實(shí)踐作者曾探學(xué)習(xí)總結(jié),如想深入了解,請(qǐng)支持作者原版單例模式實(shí)現(xiàn)單例模式單例模式的定義是保證一個(gè)類僅有一個(gè)實(shí)例,并提供一個(gè)訪問(wèn)它的全局訪問(wèn)點(diǎn)。 本系列為《JavaScript設(shè)計(jì)模式與開(kāi)發(fā)實(shí)踐》(作者:曾探)學(xué)習(xí)總結(jié),如想深入了解,請(qǐng)支持作者原版 單例模式 實(shí)現(xiàn)單例模式 單例模式的定義是:保證一個(gè)類僅有一個(gè)實(shí)例,并提供一個(gè)訪問(wèn)它的全局訪問(wèn)點(diǎn)。單例模式是一種常用的模式...
摘要:所以程序在引入文件的時(shí)候用了單例模式,一個(gè)文件實(shí)例化一次,這種做法無(wú)疑是好的,但是也容易引起。在我們平時(shí)的開(kāi)發(fā)過(guò)程中,可以借鑒這兩種方式去緩存變量,節(jié)點(diǎn)等。 這一章作者講了一個(gè)例子,就是在用單例模式生成一個(gè)dom節(jié)點(diǎn),還要做到只有訪問(wèn)的時(shí)候才創(chuàng)建,后續(xù)訪問(wèn)直接用前面創(chuàng)建的。那么實(shí)際開(kāi)發(fā)中我們會(huì)用到這個(gè)模式嗎?現(xiàn)在我們基本都是用vue,react,angular開(kāi)發(fā),不太會(huì)直接去操作do...
摘要:博主按每天一個(gè)設(shè)計(jì)模式旨在初步領(lǐng)會(huì)設(shè)計(jì)模式的精髓,目前采用靠這吃飯和純粹喜歡兩種語(yǔ)言實(shí)現(xiàn)。單例模式用途如果一個(gè)類負(fù)責(zé)連接數(shù)據(jù)庫(kù)的線程池日志記錄邏輯等等,此時(shí)需要單例模式來(lái)保證對(duì)象不被重復(fù)創(chuàng)建,以達(dá)到降低開(kāi)銷的目的。 博主按:《每天一個(gè)設(shè)計(jì)模式》旨在初步領(lǐng)會(huì)設(shè)計(jì)模式的精髓,目前采用javascript(_靠這吃飯_)和python(_純粹喜歡_)兩種語(yǔ)言實(shí)現(xiàn)。誠(chéng)然,每種設(shè)計(jì)模式都有多種實(shí)...
閱讀 4100·2021-11-18 13:21
閱讀 4927·2021-09-27 14:01
閱讀 3177·2019-08-30 15:53
閱讀 2452·2019-08-30 15:43
閱讀 1791·2019-08-30 13:10
閱讀 1600·2019-08-29 18:39
閱讀 949·2019-08-29 15:05
閱讀 3400·2019-08-29 14:14