摘要:同時將該類的構(gòu)造函數(shù)定義為私有方法,避免其他函數(shù)使用該構(gòu)造函數(shù)來實例化對象,只通過該類的靜態(tài)方法來得到該類的唯一實例。
什么是單例模式
單例就是保證一個類只有一個實例,實現(xiàn)的方法一般是先判斷實例存在與否,如果存在直接返回,如果不存在就創(chuàng)建了再返回,這就確保了一個類只有一個實例對象。在JavaScript里,單例作為一個命名空間提供者,從全局命名空間里提供一個唯一的訪問點來訪問該對象。
整個運行期間只會被初始化一次。
jquery就是一個很大的單例 (function(){var jquery=(function(){})();window.jQuery = window.$ = jQuery;})(window);
var Singleton = { attr1: "test1", attr2: 10, method: function(){ ... }, ... }
這就是一個單例對象,使用對象字面量的方法,Singleton是全局變量,js載入時被初始化一次。
jquery就是一個很大的單例 (function(){var jquery=(function(){})();window.jQuery = window.$ = jQuery;})(window);
如果以后要擴展該對象,你可以添加自己的私有成員和方法,然后使用閉包在其內(nèi)部封裝這些變量和函數(shù)聲明。只暴露你想暴露的public成員和方法,樣例代碼如下:
var mySingleton = function () { /* 這里聲明私有變量和方法 */ var privateVariable = "something private"; function showPrivate() { console.log(privateVariable); } /* 公有變量和方法(可以訪問私有變量和方法) */ return { publicMethod: function () { showPrivate(); }, publicVar: "the public can see this!" }; }; var single = mySingleton(); single.publicMethod(); // 輸出 "something private" console.log(single.publicVar); // 輸出 "the public can see this!"
但如果我們想做到只有在使用的時候才初始化,那該如何做呢?
由于單例對象一直存在內(nèi)存之中,如果比較大的實例,一開始就初始化,代價比較高,可以等到需要的時候再初始化
為了節(jié)約資源的目的,我們可以另外一個構(gòu)造函數(shù)里來初始化這些代碼,如下:
var Singleton = (function () { var instantiated; function init() { /*這里定義單例代碼*/ return { publicMethod: function () { console.log("hello world"); }, publicProperty: "test" }; } return { getInstance: function () { if (!instantiated) { instantiated = init(); } return instantiated; } }; })(); /*調(diào)用公有的方法來獲取實例:*/ Singleton.getInstance().publicMethod();
單例模式的思路是:一個類能返回一個對象的引用(并且永遠是同一個)和一個獲得該實例的方法(靜態(tài)方法,通常使用 getInstance 名稱)。那么當我們調(diào)用這個方法時,如果類持有的引用不為空就返回該引用,否者就創(chuàng)建該類的實例,并且將實例引用賦值給該類保持的那個引用再返回。同時將該類的構(gòu)造函數(shù)定義為私有方法,避免其他函數(shù)使用該構(gòu)造函數(shù)來實例化對象,只通過該類的靜態(tài)方法來得到該類的唯一實例。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/88743.html
摘要:但是,這并不是采用單例的唯一原因。使用命名空間單例模式也被稱為模塊設(shè)計模式。函數(shù)內(nèi)部聲明了一些局部函數(shù)和或變量。緊隨函數(shù)聲明放置即可立即執(zhí)行外部函數(shù),并將所得的對象文字費賠給變量。 JavaScript設(shè)計模式-第一部分:單例模式、組合模式和外觀模式 設(shè)計模式是一些可靠的編程方式,有助于保證代碼更加易于維護、擴展及分離,所有設(shè)計模式在創(chuàng)建大型JavaScript應(yīng)用程序時均不可或缺 單...
摘要:此時我們創(chuàng)建的對象內(nèi)保存靜態(tài)變量通過取值器訪問,最后將這個對象作為一個單例放在全局空間里面作為靜態(tài)變量單例對象供他人使用。 單例模式 又被稱為單體模式,是只允許實例化一次的對象類。有時我們也用一個對象來規(guī)劃一個命名空間,井井有條的管理對象上面的屬性和方法。 傳統(tǒng)的面向?qū)ο笳Z言中單例模式的實現(xiàn),均是單例對象從類中創(chuàng)建而來,在以類為中心的語言中,這是很常見的做法。如果需要某個對象,就必須先...
摘要:不符合設(shè)計模式中的單一職責的概念。引入代理實現(xiàn)單例模式引入代理實現(xiàn)單例模式的特點我們負責管理單例的邏輯移到了代理類中。的單例模式對比在以上的代碼中實現(xiàn)的單例模式都混入了傳統(tǒng)面向?qū)ο笳Z言的特點。 聲明:這個系列為閱讀《JavaScript設(shè)計模式與開發(fā)實踐》 ----曾探@著一書的讀書筆記 1.單例模式的特點和定義 保證一個類僅有一個實例,并且提供一個訪問它的全局訪問點。 2.傳統(tǒng)面向?qū)?..
摘要:停更許久,近期計劃更新設(shè)計模式系列。單例模式是創(chuàng)建型設(shè)計模式的一種。雖然它不是正規(guī)的單例模式,但不可否認確實具備類單例模式的特點。適用場景單例模式的特點,意圖解決維護一個全局實例對象。 停更許久,近期計劃更新:設(shè)計模式系列。 showImg(https://segmentfault.com/img/bVbt7uw?w=800&h=600); 單例模式:限制類實例化次數(shù)只能一次,一個類只...
摘要:觀察構(gòu)造函數(shù)的代碼,該構(gòu)造函數(shù)實際上負責了兩件事情第一是創(chuàng)建對象和執(zhí)行初始化方法,第二是保證只有一個對象。惰性單例在實際開發(fā)中非常有用,是單例模式的重點。 單例模式 單例模式的定義是: 保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。 單例模式是一種常用的模式,有一些對象我們往往只需要一個,比如線程池、全局緩存、瀏覽器的window對象等。例如,當我們點擊登錄按鈕時,頁面會彈出一...
摘要:在面向?qū)ο蟮恼Z言中,比如,等,單例模式通常是定義類時將構(gòu)造函數(shù)設(shè)為,保證對象不能在外部被出來,同時給類定義一個靜態(tài)的方法,用來獲取或者創(chuàng)建這個唯一的實例。 萬事開頭難,作為正經(jīng)歷菜鳥賽季的前端player,已經(jīng)忘記第一次告訴自己要寫一些東西出來是多久以的事情了。。。如果,你也和我一樣,那就像我一樣,從現(xiàn)在開始,從看到這篇文章開始,打開電腦,敲下你的第一篇文章(或者任何形式的文字)吧。 ...
閱讀 2013·2021-09-29 09:35
閱讀 1948·2019-08-30 14:15
閱讀 2973·2019-08-30 10:56
閱讀 954·2019-08-29 16:59
閱讀 571·2019-08-29 14:04
閱讀 1300·2019-08-29 12:30
閱讀 1020·2019-08-28 18:19
閱讀 509·2019-08-26 11:51