理解JavaScript設(shè)計(jì)模式中的單例模式
單例模式(Singleton Pattern
)是最簡(jiǎn)單的設(shè)計(jì)模式之一。這種類(lèi)型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對(duì)象的最佳方式。
單例模式涉及到一個(gè)單一的類(lèi),該類(lèi)負(fù)責(zé)創(chuàng)建自己的對(duì)象,同時(shí)確保只有單個(gè)對(duì)象被創(chuàng)建。這個(gè)類(lèi)提供了一種訪問(wèn)其唯一的對(duì)象的方式,可以直接訪問(wèn),不需要實(shí)例化該類(lèi)的對(duì)象。
- 1、單例類(lèi)只能有一個(gè)實(shí)例。
- 2、單例類(lèi)必須自己創(chuàng)建自己的唯一實(shí)例。
- 3、單例類(lèi)必須給所有其他對(duì)象提供這一實(shí)例。
這樣做的缺點(diǎn)就是:沒(méi)有接口,不能繼承,與單一職責(zé)原則沖突,一個(gè)類(lèi)應(yīng)該只關(guān)心內(nèi)部邏輯,而不關(guān)心外面怎么樣來(lái)實(shí)例化。
優(yōu)點(diǎn)則有:
- 1、在內(nèi)存里只有一個(gè)實(shí)例,減少了內(nèi)存的開(kāi)銷(xiāo),尤其是頻繁的創(chuàng)建和銷(xiāo)毀實(shí)例。
- 2、避免對(duì)資源的多重占用。
最簡(jiǎn)單的單例模式舉例:
// 定義一個(gè)類(lèi) function Singleton(name) { this.name = name; this.instance = null; } // 原型擴(kuò)展類(lèi)的一個(gè)方法getName() Singleton.prototype.getName = function() { console.log(this.name) }; // 獲取類(lèi)的實(shí)例 Singleton.getInstance = function(name) { if(!this.instance) { this.instance = new Singleton(name); console.log(this.instance) // {name: 'a', instance: null} } return this.instance }; // 獲取對(duì)象1 var a = Singleton.getInstance('a'); // 獲取對(duì)象2 var b = Singleton.getInstance('b'); // 進(jìn)行比較 console.log(a === b); // true
不過(guò),這樣寫(xiě),不夠直觀,因?yàn)槲覀兺ǔ6际峭ㄟ^(guò) new 來(lái)創(chuàng)建實(shí)例的;
所以,改寫(xiě)為:
// 單例構(gòu)造函數(shù) function CreateSingleton (name) { this.name = name; this.getName(); }; // 獲取實(shí)例的名字 CreateSingleton.prototype.getName = function() { console.log(this.name) }; // 單例對(duì)象 var Singleton = (function(){ var instance; return function (name) { if(!instance) { instance = new CreateSingleton(name); } return instance; } })(); // 創(chuàng)建實(shí)例對(duì)象1 var a = new Singleton('a'); // 創(chuàng)建實(shí)例對(duì)象2 var b = new Singleton('b'); console.log(a===b);
到此這篇關(guān)于理解JavaScript設(shè)計(jì)模式中的單例模式的文章就介紹到這了,更多相關(guān)JS單例模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
非常不錯(cuò)的不間斷循環(huán)滾動(dòng)類(lèi) 兼容多瀏覽器
非常不錯(cuò)的不間斷循環(huán)滾動(dòng)類(lèi) 兼容多瀏覽器...2006-12-12javascript對(duì)象的property和prototype是這樣一種關(guān)系
javascript對(duì)象的property和prototype是這樣一種關(guān)系...2007-03-03淺談javascript中的instanceof和typeof
這篇文章主要簡(jiǎn)單介紹了javascript中的instanceof和typeof的相關(guān)資料,需要的朋友可以參考下2015-02-02簡(jiǎn)單實(shí)現(xiàn)js選項(xiàng)卡切換效果
這篇文章主要為大家詳細(xì)介紹了簡(jiǎn)單實(shí)現(xiàn)js選項(xiàng)卡切換效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02JS獲取url參數(shù),JS發(fā)送json格式的POST請(qǐng)求方法
下面小編就為大家分享一篇JS獲取url參數(shù),JS發(fā)送json格式的POST請(qǐng)求方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-03-03Bootstrap每天必學(xué)之彈出框(Popover)插件
Bootstrap每天必學(xué)之彈出框(Popover)插件,彈出框的內(nèi)容完全可使用 Bootstrap 數(shù)據(jù) API(Bootstrap Data API)來(lái)填充,如何實(shí)現(xiàn)請(qǐng)參考本文2016-04-04js substring從右邊獲取指定長(zhǎng)度字符串(示例代碼)
本篇文章主要是對(duì)js substring從右邊獲取指定長(zhǎng)度字符串的示例代碼進(jìn)行了介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2013-12-12