不知不覺國慶假期已經(jīng)過去了一半,是不是又碌碌無為,渾渾噩噩地度過了幾天,哈哈,我也一樣。今天,我們來講一講一個(gè)單例模式。這個(gè)應(yīng)該是最簡單的設(shè)計(jì)模式了,相信每一個(gè)程序員都能學(xué)會。

場景
如果我們在代碼中需要一個(gè)全局類,我們可以讓它變成一個(gè)單例。例如,我們在系統(tǒng)的多個(gè)地方需要讀取一個(gè)配置文件,我們并不需要每次都去new一個(gè)實(shí)例,然后去讀文件,只需要維護(hù)一個(gè)全局的Config類,并且每次使用的時(shí)候校驗(yàn)下文件是否變更即可。依賴可以減少類的創(chuàng)建跟銷毀的時(shí)候的開銷,二來也減少了讀取文件的次數(shù)。又如我們需要維護(hù)一個(gè)計(jì)數(shù)器,我們當(dāng)然不想每次統(tǒng)計(jì)的時(shí)候都穿透去寫DB,我們可以先寫到內(nèi)存當(dāng)中。還有,在程序開發(fā)中,我們常常運(yùn)用到各種池化技術(shù),我們可以將線程池,連接池作為一個(gè)單例,統(tǒng)一進(jìn)行分配跟管理。
實(shí)現(xiàn)
在Java中,我們通常是這么實(shí)現(xiàn)單例的,原本我們的類的構(gòu)造方法是公有的,所以我們無論在哪都能實(shí)例化這個(gè)類,所以我們必須把共有方法改成私有方法,然后通過一個(gè)共有函數(shù)來獲取這個(gè)實(shí)例。

我們獲取的時(shí)候,判斷它是否為空,如果為空,那么就初始化一個(gè)新的,否則直接返回。相信聰明的朋友已經(jīng)看到了這里面存在一個(gè)小問題,那就是存在并發(fā),一般我們可以使用雙if與synchronized關(guān)鍵字,讓初始化的代碼最多只會執(zhí)行一次。

優(yōu)點(diǎn)
因?yàn)槭侨治ㄒ坏?,所以減少了類的創(chuàng)建與銷毀時(shí)候的開銷。對于一些資源的實(shí)例,可以更加容易進(jìn)行管理與維護(hù),特別是對于一些配置類,多實(shí)例總會出現(xiàn)一些意想不到的錯(cuò)誤。
總結(jié)
好了,今天我們學(xué)習(xí)了單例模式,是不是很簡單,隨手就能實(shí)現(xiàn)一個(gè)!歡迎大家關(guān)注我,共同學(xué)習(xí),共同進(jìn)步。大家的支持是我繼續(xù)嘮嗑的動力。同名公眾號(沙茶敏碎碎念)