資料來源
how2j的Java教程
一验毡、什么是單例模式?
??單例模式又叫做 Singleton模式货葬,指的是一個類,在一個JVM里蘸炸,只有一個實例存在。
二尖奔、單例模式分為兩種
LOL里有一個怪叫大龍GiantDragon搭儒,只有一只,所以該類提茁,只能被實例化一次
- 餓漢式單例模式
GiantDragon 應該只有一只淹禾,通過私有化其構造方法,使得外部無法通過new 得到新的實例茴扁。
GiantDragon 提供了一個public static的getInstance方法铃岔,外部調用者通過該方法獲取12行定義的對象,而且每一次都是獲取同一個對象峭火。 從而達到單例的目的毁习。
這種單例模式又叫做餓漢式單例模式,無論如何都會創(chuàng)建一個實例卖丸。
/**
* 單例模式
* 單例模式又叫做 Singleton模式纺且,指的是一個類,在一個JVM里稍浆,只有一個實例存在载碌。
* 餓漢式單例模式
*/
public class GiantDragon {
private GiantDragon(){
}
private static GiantDragon instance = new GiantDragon();
public static GiantDragon getInstance(){
return instance;
}
}
- 懶漢式單例模式
懶漢式單例模式與餓漢式單例模式不同,只有在調用getInstance的時候衅枫,才會創(chuàng)建實例嫁艇。
/**
* 懶漢式單例模式
*/
public class GiantDragon {
//私有化構造方法使得該類無法在外部通過new 進行實例化
private GiantDragon(){
}
//準備一個類屬性,用于指向一個實例化對象弦撩,但是暫時指向null
private static GiantDragon instance;
//public static 方法步咪,返回實例對象
public static GiantDragon getInstance(){
//第一次訪問的時候,發(fā)現(xiàn)instance沒有指向任何對象益楼,這時實例化一個對象
if(null==instance){
instance = new GiantDragon();
}
//返回 instance指向的對象
return instance;
}
}
三歧斟、什么時候使用餓漢式,什么時候使用懶漢式
餓漢式是立即加載的方式偏形,無論是否會用到這個對象,都會加載觉鼻。
如果在構造方法里寫了性能消耗較大俊扭,占時較久的代碼,比如建立與數(shù)據(jù)庫的連接坠陈,那么就會在啟動的時候感覺稍微有些卡頓萨惑。
懶漢式捐康,是延遲加載的方式,只有使用的時候才會加載庸蔼。 并且有線程安全的考量(鑒于同學們學習的進度解总,暫時不對線程的章節(jié)做展開)。
使用懶漢式姐仅,在啟動的時候花枫,會感覺到比餓漢式略快,因為并沒有做對象的實例化掏膏。 但是在第一次調用的時候劳翰,會進行實例化操作,感覺上就略慢馒疹。
看業(yè)務需求佳簸,如果業(yè)務上允許有比較充分的啟動和初始化時間,就使用餓漢式颖变,否則就使用懶漢式生均。
四、單例模式面試題
這個是面試的時候經常會考的點腥刹,面試題通常的問法是:
什么是單例模式马胧?
回答的時候,要答到三元素
- 構造方法私有化
- 靜態(tài)屬性指向實例
- public static的 getInstance方法肛走,返回第二步的靜態(tài)屬性
業(yè)精于勤漓雅,荒于嬉;
行成于思朽色,毀于隨邻吞。
加油!!!