
文章插圖
定義
確保一個(gè)類僅有一個(gè)實(shí)例,并提供一個(gè)訪問它的全局訪問點(diǎn) 。
特點(diǎn):
可以來劃分命名空間,從而清除全局變量所帶來的風(fēng)險(xiǎn) ??梢园汛a組織的更為一體,便于閱讀和維護(hù) ??梢员粚?shí)例化,且實(shí)例化一次 。單例模式使用的場(chǎng)景
比如線程池、全局緩存等 。我們所熟知的瀏覽器的window對(duì)象就是一個(gè)單例,在JavaScript開發(fā)中,對(duì)于這種只需要一個(gè)的對(duì)象,我們的實(shí)現(xiàn)往往使用單例 。
實(shí)現(xiàn)單例模式 (不透明的)
一般我們是這樣實(shí)現(xiàn)單例的,用一個(gè)變量來標(biāo)志當(dāng)前的類已經(jīng)創(chuàng)建過對(duì)象,如果下次獲取當(dāng)前類的實(shí)例時(shí),直接返回之前創(chuàng)建的對(duì)象即可 。代碼如下:
我們也可以使用閉包來實(shí)現(xiàn):
這個(gè)單例實(shí)現(xiàn)獲取對(duì)象的方式經(jīng)常見于新手的寫法,這種方式獲取對(duì)象雖然簡(jiǎn)單,但是這種實(shí)現(xiàn)方式不透明 。知道的人可以通過 Singleton.getInstance() 獲取對(duì)象,不知道的需要研究代碼的實(shí)現(xiàn),這樣不好 。這與我們常見的用 new 關(guān)鍵字來獲取對(duì)象有出入,實(shí)際意義不大 。
實(shí)現(xiàn)單例模式 (透明的)
這種單例模式我以前用過一次,但是使用起來很別扭,我也見過別人用這種方式實(shí)現(xiàn)過走馬燈的效果,因?yàn)樽唏R燈在我們的應(yīng)用中絕大多數(shù)只有一個(gè) 。
這里先說一下為什么感覺不對(duì)勁,因?yàn)樵谶@個(gè)單例的構(gòu)造函數(shù)中一共干了兩件事,一個(gè)是創(chuàng)建對(duì)象并打印實(shí)例名字,另一個(gè)是保證只有一個(gè)實(shí)例對(duì)象 。這樣代碼量大的化不方便管理,應(yīng)該盡量做到職責(zé)單一 。
我們通常會(huì)將代碼改成下面這個(gè)樣子:
這種實(shí)現(xiàn)方式我們就比較熟悉了,我們?cè)陂_發(fā)中經(jīng)常會(huì)使用中間類,通過它來實(shí)現(xiàn)原類所不具有的特殊功能 。有的人把這種實(shí)現(xiàn)方式叫做代理,這的確是單例模式的一種應(yīng)用,稍后將在代理模式進(jìn)行詳解 。
說了這么多我們還是在圍繞著傳統(tǒng)的單例模式實(shí)現(xiàn)在進(jìn)行講解,那么具有JavaScript特色的單例模式是什么呢 。
JavaScript單例模式
在我們的開發(fā)中,很多同學(xué)可能并不知道單例到底是什么,應(yīng)該如何使用單例,但是他們所寫的代碼卻剛好滿足了單例模式的要求 。如要實(shí)現(xiàn)一個(gè)登陸彈窗,不管那個(gè)頁面或者在頁面的那個(gè)地方單擊登陸按鈕,都會(huì)彈出登錄窗 。一些同學(xué)就會(huì)寫一個(gè)全局的對(duì)象來實(shí)現(xiàn)登陸窗口功能,是的,這樣的確可以實(shí)現(xiàn)所要求的登陸效果,也符合單例模式的要求,但是這種實(shí)現(xiàn)其實(shí)是一個(gè)巧合,或者一個(gè)美麗的錯(cuò)誤 。由于全局對(duì)象,或者說全局變量正好符合單例的能夠全局訪問,而且是唯一的 。但是我們都知道,全局變量是可以被覆蓋的,特別是對(duì)于初級(jí)開發(fā)人員來說,剛開始不管定義什么基本都是全局的,這樣的好處是方便訪問,壞處是一不留意就會(huì)引起沖突,特別是在做一個(gè)團(tuán)隊(duì)合作的大項(xiàng)目時(shí),所以成熟的有經(jīng)驗(yàn)的開發(fā)人員盡量減少全局的聲明 。
而在開發(fā)中我們避免全局變量污染的通常做法如下:
全局命名空間使用閉包它們的共同點(diǎn)是都可以定義自己的成員、存儲(chǔ)數(shù)據(jù) 。區(qū)別是全局命名空間的所有方法和屬性都是公共的,而閉包可以實(shí)現(xiàn)方法和屬性的私有化 。
惰性單例模式
說實(shí)話,在我下決心學(xué)習(xí)設(shè)計(jì)模式之前我并不知道,單例模式還分惰性單例模式,直到我看了曾探大神的《JvaScript設(shè)計(jì)模式與開發(fā)實(shí)踐》后才知道了還有惰性單例模式,那么什么是惰性單例模式呢?在說惰性單例模式之前,請(qǐng)?jiān)试S我先說一個(gè)我們都知道的lazyload加載圖片,它就是惰性加載,只當(dāng)含有圖片資源的dom元素出現(xiàn)在媒體設(shè)備的可視區(qū)時(shí),圖片資源才會(huì)被加載,這種加載模式就是惰性加載;還有就是下拉刷新資源也是惰性加載,當(dāng)你觸發(fā)下拉刷新事件資源才會(huì)被加載等 。而惰性單例模式的原理也是這樣的,只有當(dāng)觸發(fā)創(chuàng)建實(shí)例對(duì)象時(shí),實(shí)例對(duì)象才會(huì)被創(chuàng)建 。這樣的實(shí)例對(duì)象創(chuàng)建方式在開發(fā)中很有必要的 。
以上關(guān)于本文的內(nèi)容,僅作參考!溫馨提示:如遇健康、疾病相關(guān)的問題,請(qǐng)您及時(shí)就醫(yī)或請(qǐng)專業(yè)人士給予相關(guān)指導(dǎo)!
「愛刨根生活網(wǎng)」www.malaban59.cn小編還為您精選了以下內(nèi)容,希望對(duì)您有所幫助:- web前端三大主流框架 css偶數(shù)選擇器以及用法
- js追加樣式css樣式的方法 js樣式選擇
- 配置java環(huán)境變量 java不是內(nèi)部命令或外部命令
- css不透明度的設(shè)置 css不透明度怎么設(shè)置
- 網(wǎng)頁制作css講解 css網(wǎng)站模板素材
- 聯(lián)想將PC級(jí)散熱理念引入手機(jī) 聯(lián)想的散熱
- 背景圖片設(shè)置方法 css設(shè)置背景圖片大小
- 分享css設(shè)置字體顏色的代碼 css設(shè)置字體樣式屬性
- 教你css設(shè)置文字自動(dòng)換行 css設(shè)置陰影效果
- css文字透明效果設(shè)置步驟 css透明度設(shè)置三種方法
