應(yīng)用最廣的模式-單例模式
應(yīng)用場(chǎng)景
- 確保某個(gè)類有且只有一個(gè)對(duì)象的場(chǎng)景,避免產(chǎn)生多個(gè)對(duì)象消耗過(guò)多的資源颊郎,或者某種類型的對(duì)象只應(yīng)該有且只有一個(gè)霎苗。
- 例如,創(chuàng)建一個(gè)對(duì)象需要消耗資源過(guò)多内狸,如要訪問(wèn)IO和數(shù)據(jù)庫(kù)等資源厘擂,這時(shí)候就要考慮使用單例模式。
- 單例模式廣泛應(yīng)用于線程池刽严、緩存、日志對(duì)象等場(chǎng)景眨补,這些應(yīng)用場(chǎng)景基本都涉及到資源管理
關(guān)鍵點(diǎn)
- 構(gòu)造函數(shù)不對(duì)外開放倒脓,一般為private撑螺;
- 通過(guò)一個(gè)靜態(tài)方法或者枚舉返回單例類對(duì)象崎弃;
- 確保單例類的對(duì)象有且只有一個(gè),尤其是在多線程環(huán)境下
- 確保單例類對(duì)象在反序列化時(shí)不會(huì)重新構(gòu)建對(duì)象
實(shí)現(xiàn)方式
包括:餓漢模式线婚,懶漢模式,雙重校驗(yàn)鎖模式靜態(tài)內(nèi)部類艇炎,枚舉等..
餓漢,靜態(tài)內(nèi)部類居砖,枚舉都是線程安全的驴娃。雙重校驗(yàn)鎖使用volatile
推薦實(shí)現(xiàn)方法:靜態(tài)內(nèi)部類
推薦詞:內(nèi)部類的方式保證了僅當(dāng)單例類被調(diào)用時(shí)才實(shí)例化對(duì)象,同時(shí)也保證了線程安全蔗草;他利用classloader的機(jī)制來(lái)保證初始化instance時(shí)只有一個(gè)線程咒彤;當(dāng)getInstance方法被調(diào)用時(shí)镶柱,內(nèi)部類SingletonHolder才會(huì)被裝載模叙,從而實(shí)例化單例類。
public class Singleton {
//1.私有構(gòu)造方法
private Singleton() {
}
//2.創(chuàng)建靜態(tài)內(nèi)部類
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
//3.創(chuàng)建實(shí)現(xiàn)方法
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
枚舉單例
推薦詞:寫法簡(jiǎn)單故觅,線程安全渠啊,反序列化也不會(huì)生成新的實(shí)例
public enum SingletonEnum {
INSTANCE;
public void showMessage(){
System.out.println("Hello World !!!");
}
}
總結(jié)
單例模式是運(yùn)用頻率很高的模式,但是贯溅,由于在客戶端通常沒(méi)有高并發(fā)情況灭返,因此,選擇哪種方式并不會(huì)有太大影響
Kotlin
這個(gè)相當(dāng)于餓漢模式熙含,基本一般開發(fā)要求都能滿足了
object SingletonKt {
}