1.保證從系統(tǒng)啟動到系統(tǒng)停止,全過程只會產(chǎn)生一個實例
2.當我們在應用中遇到功能性沖突的時候让腹,需要使用單例模式
/**
* 懶漢式(靜態(tài)內(nèi)部類)
*/
public class SinglePattern {
/**
* 將默認構(gòu)造器私有化
*/
private SinglePattern() { }
/**
* 1. 可以先聲明一個靜態(tài)內(nèi)部類 (解決反射破壞問題)
* 2, 也可以不使用靜態(tài)內(nèi)部類 直接使用 private static final SinglePattern SINGLE_PATTERN = new SinglePattern();
* 然后在getInstance()方法中直接 return SINGLE_PATTERN;
* private 私有保證別人不能修改
*
*/
public static class LazyHolder{
// final 為了防止內(nèi)部誤操作远剩,代理模式,Cglib的代理模式骇窍,如果不是final子類是可以重新賦值的
private static final SinglePattern SINGLE_PATTERN = new SinglePattern();
}
/**
* 同樣提供靜態(tài)方法獲取實例
* final 確保別人不能覆蓋
* @return
*/
public static final SinglePattern getInstance(){
// 靜態(tài)方法中的邏輯瓜晤,是要在用戶調(diào)用的時候才開始執(zhí)行的
// 方法中實現(xiàn)邏輯需要分配內(nèi)存,也是調(diào)用時才分配的
return LazyHolder.SINGLE_PATTERN;
// return SINGLE_PATTERN;
}
//不管該class有沒有實例化腹纳,static靜態(tài)塊總會在classLoader執(zhí)行完以后痢掠,就加載完畢
static{
// 靜態(tài)塊中的內(nèi)容,只能訪問靜態(tài)屬性和靜態(tài)方法
// 只要是靜態(tài)方法或者屬性嘲恍,直接可以用Class的名字就能點出來
// JVM內(nèi)存中的靜態(tài)區(qū)足画,這一塊的內(nèi)容是公共的,與靜態(tài)方法不同,靜態(tài)代碼塊不管是否調(diào)用就直接在加載完畢后分配內(nèi)存空間佃牛,放在那里
}
}
/*
* 類裝載到JVM中的過程
// 1. 從上往下
// 2. 先屬性淹辞、后方法
// 3. 先靜態(tài)、后動態(tài)
*/