­

一個案例搞懂工廠模式和單例模式

一個案例搞懂工廠模式和單例模式

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 工廠模式

img

        /**
         *  一開始,窮,想吃面必須得自己做
         *  想吃拉麵得自己做,new LzNoodles()
         *  想吃泡麵得自己做,new PaoNoodles()
         *  想吃熱乾麵得自己做,new ReganNoodles()
         */
        // 做拉麵吃
        INoodles lzNoodles = new LzNoodles();
        // 做泡麵吃
        // INoodles paoNoodles = new PaoNoodles();
        // 做熱乾麵吃
        // INoodles reganNoodles = new ReganNoodles();

        // 然而,new來new去,改來改去,好心煩......

img

        /**
         * 忽然,有一天走了狗屎運成了暴發戶
         * 幸福生活從此來臨,吃面從此變得簡單
         * 給麵館說一聲想吃啥,麵館做好了給自己就好了
         * 自己不必關心麵條怎麼做(怎麼new,如何new)讓麵館操心去吧(麵館幫我們new)!
         * 好省心,有錢就是好,太爽了!
         */
        INoodles iNoodles = SimpleNoodlesFactory.createNoodles(2);  // 和具體的對象脫離關係
        iNoodles.desc();

再進行演變: 考慮使用工廠模式,給個工廠生產自己的專屬麵條,需要吃那個創建即可。

  • 工廠是負責創建對象

img