今天自己想要入坑設計模式了,想寫寫博客記錄自己學習設計模式的一些感悟吧
首先就是單例模式的學習,學習過java的對這個模式應該不會陌生,分別是兩種模式,餓漢式(類加載的時候創建對象),懶漢式(調用方法的時候創建對象),從名字大概就知道他們在什麼時候創建對象了
這裏我就直接上代碼了
package com.lyf.single;
/**
* 懶漢式,對象被調用時纔去創建
* 單例
* 1.構造函數私有化
* 2.靜態方法獲取對象
*/
public class SingleLazy {
private static SingleLazy single;
private SingleLazy() {
}
public static SingleLazy getSingle() {
if (single == null) {
/**
* 多線程訪問下,可能 if 同時滿足條件,添加鎖
*/
synchronized (SingleLazy.class) {
// 雙重檢測
if (single == null) {
single = new SingleLazy();
}
}
}
return single;
}
}
我們先分析懶漢式:單例模式 1)構造方法私有化 2)對象私有化, 這樣外部類,方法就不能用 new 關鍵字來產生對象了,
所以我們要在getSingle 方法前加上 static 關鍵字,通過類名.getSingle 調用生產對象,既然是單例模式,那就只能存在一個對象,所以方法先判斷,如果對象爲 null 纔去創建對象。加上鎖關鍵字是因爲考慮到多線程下,假設線程A,線程B同時調用方法,此時他們兩個的single都是null,這時候就會創建兩個對象,就不符合單例模式思想了,在 synchronized 鎖內,又有if雙重判斷,這還是因爲多線程下,線程A,線程B,假設A 進入,拿到鎖,線程B等待,A創建完成之後,B線程的 single 還是爲null,這時候就又會創建,那這樣就創建了兩個對象,不符合單例模式的思想了。大家也可以藉助畫圖輔助來進行理解
接下來介紹餓漢式,其實就是沒調用方法前就創建了對象,體現出“餓”
package com.lyf.single;
public class SingleHungry {
/**
* 在類加載時就被實例化
*/
private static SingleHungry single = new SingleHungry();
private SingleHungry() {}
public static SingleHungry getSingleHungry() {
return single;
}
}
在類加載的時候就創建了對象,這種就是比較簡單,看起來也是很容易理解
測試代碼
package com.lyf.single;
public class Test {
public static void main(String[] args) {
// SingleLazy single = new SingleLazy();
// SingleLazy single1 = SingleLazy.getSingle();
// SingleLazy single2 = SingleLazy.getSingle();
SingleHungry single1 = SingleHungry.getSingleHungry();
SingleHungry single2 = SingleHungry.getSingleHungry();
System.out.println(single1 == single2);
}
}
返回結果都是 true,你自己也可以用多線程去測試,當然返回結果還是true