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

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

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

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