1就漾、單例類只能有一個實例。
2痕慢、單例類必須自己創(chuàng)建自己的唯一實例尚揣。
3、單例類必須給所有其他對象提供這一實例掖举。步驟 1 創(chuàng)建一個 Singleton 類快骗。
public class SingleObject {
//創(chuàng)建 SingleObject 的一個對象
private static SingleObject instance = new SingleObject();
//讓構(gòu)造函數(shù)為 private,這樣該類就不會被實例化
private SingleObject(){}
//獲取唯一可用的對象
public static SingleObject getInstance(){
return instance;
}
public void showMessage(){
System.out.println("Hello World!");
}
}
- 步驟 2 從 singleton 類獲取唯一的對象。
public class SingletonPatternDemo {
public static void main(String[] args) {
//不合法的構(gòu)造函數(shù)
//編譯時錯誤:構(gòu)造函數(shù) SingleObject() 是不可見的
//SingleObject object = new SingleObject();
//獲取唯一可用的對象
SingleObject object = SingleObject.getInstance();
//顯示消息
object.showMessage();
}
}
- 餓漢式
- 懶漢式
- 懶漢式與餓漢式的區(qū)別:
懶漢式:實名一個靜態(tài)對象方篮,并且在用戶第一次調(diào)用getInstance 時進(jìn)行初始化思灌,優(yōu)點:單例只有在使用時才會被實例化,一定程度上節(jié)約了資源恭取。缺點:是第一次加載時需要及時進(jìn)行實例化泰偿,反應(yīng)稍慢,最大的問題是每次調(diào)用getInstance 都進(jìn)行同步蜈垮,造成不必要的同步開銷耗跛。一般不建議這么用。
餓漢式:是在聲明靜態(tài)對象時就已經(jīng)初始化攒发。
-
雙檢索 Double Check Lock (DCL)實現(xiàn)單例
DCL 的優(yōu)點调塌,資源利用率高,第一次執(zhí)行g(shù)etInstance 時才會被實例化惠猿,效率高羔砾。缺點:第一次加載反應(yīng)慢,也由于java 內(nèi)存 模型的原因偶爾會失敗偶妖,在高并發(fā)環(huán)境下姜凄,有一定缺陷,雖然發(fā)生概率很小趾访。(很常用)
- 枚舉單例