一個案例搞懂工廠模式和單例模式
一個案例搞懂工廠模式和單例模式
1 單例模式
- 一個對象只有一個實例
- 單例類必須自己創建自己的唯一實例。
- 單例類必須給所有其他對象提供這一實例。
注意:所有的單例模式,應當使其構造方法私有化。
1.1 餓漢單例模式
所謂餓漢單例:就是指在
類被載入時
就創建自己的唯一實例。
/**
* @author look-word
*
* 餓漢式(立即載入)
*/
public class HungrySingleton {
// 構造方法私有化
private HungrySingleton() {}
// 將自身實例化對象設置為一個屬性,並用static、final修飾
private static final HungrySingleton instance = new HungrySingleton();
// 靜態方法返回該實例
public static HungrySingleton getInstance() {
return instance;
}
}
1.2 懶漢單例模式
所謂懶漢單例模式:在使用該類時,才創建實例對象。
- 注意:需要加上執行緒同步關鍵字
- 可能會存在執行緒安全問題,多個執行緒同時調用
/**
* @author 應癲
*/
public class LazySingleton {
// 將自身實例化對象設置為一個屬性,並用static修飾
private static LazySingleton instance;
// 構造方法私有化
private LazySingleton() {}
// 靜態方法返回該實例,加synchronized關鍵字實現同步
public static synchronized LazySingleton getInstance() {
if(instance == null) {
instance = new LazySingleton();
}
return instance;
}
}
名稱 | 優點 | 缺點 |
---|---|---|
餓漢單例模式 |
多執行緒安全,沒有加鎖執行效率高。 | 類載入時就初始化,浪費記憶體。 |
懶漢單例模式 |
第一次調用才初始化,避免記憶體浪費。 | 必須加鎖 synchronized 才能保證單例,但加鎖會影響效率。 |
2 工廠模式
/**
* 一開始,窮,想吃面必須得自己做
* 想吃拉麵得自己做,new LzNoodles()
* 想吃泡麵得自己做,new PaoNoodles()
* 想吃熱乾麵得自己做,new ReganNoodles()
*/
// 做拉麵吃
INoodles lzNoodles = new LzNoodles();
// 做泡麵吃
// INoodles paoNoodles = new PaoNoodles();
// 做熱乾麵吃
// INoodles reganNoodles = new ReganNoodles();
// 然而,new來new去,改來改去,好心煩......
/**
* 忽然,有一天走了狗屎運成了暴發戶
* 幸福生活從此來臨,吃面從此變得簡單
* 給麵館說一聲想吃啥,麵館做好了給自己就好了
* 自己不必關心麵條怎麼做(怎麼new,如何new)讓麵館操心去吧(麵館幫我們new)!
* 好省心,有錢就是好,太爽了!
*/
INoodles iNoodles = SimpleNoodlesFactory.createNoodles(2); // 和具體的對象脫離關係
iNoodles.desc();
再進行演變: 考慮使用工廠模式,給個工廠生產自己的專屬麵條,需要吃那個創建即可。
- 工廠是負責創建對象