Android源碼設計模式——工廠模式

工廠模式也是爲了構建一個新的對象,它是創建型模式的一種。
Android源碼設計模式——Build模式(應用:AlertDialog源碼分析)
上述是之前的Build模式,也是創建型模式一種,不懂的小夥伴可以回看下上篇博客。

工廠模式的定義

自我敘述:定義一個抽象產品類,然後繼承該抽象類形成很多的子類,在子類相當於是個:成品的產品,也就是我們真正要構建的產品。在定義一個抽象類,該抽象類內部:創建子類的公共方法定義。在定義真正的工廠實現類,繼承自該抽象類。

由此看下工廠模式的UML圖:

UML圖

上圖,分四塊:

  1. ABS Product —— 產品抽象類
  2. ConcreteProduct —— 產品實現類
  3. Abs Factory —— 抽象工廠類
  4. ConcreteFactory —— 工廠實現類

根據上述代碼,寫一個例子感受下,還是以我們的小汽車爲例:

Abs Product 小汽車的框架

不管什麼小汽車,他們都需要:輪子,發動機,車燈等公用零件

public abstract class AbsCar {

    protected String wheel; //輪子
    protected String engine; //發動機
    protected String lampBulb; //車燈
    // ........等等公共零件

    protected abstract void setWheel(String wheel);

    protected abstract void setEngine(String engine);

    protected abstract void setLampBulb(String lampBulb);
}

具體生產的小汽車
根據公共的生產小汽車標準,我們演化出了衆多類型的車,比如:奔馳,豐田。

public class ConcreteBenzCar extends AbsCar {

    private final static String TAG = "奔馳汽車";

    @Override
    protected void setWheel(String wheel) {
        Log.e(TAG, "構造輪子");
    }

    @Override
    protected void setEngine(String engine) {
        Log.e(TAG, "構造發動機");
    }

    @Override
    protected void setLampBulb(String lampBulb) {
        Log.e(TAG, "構造車燈");
    }
}
public class ConcreteToyotaCar extends AbsCar {

    private final static String TAG = "豐田汽車";

    @Override
    protected void setWheel(String wheel) {
        Log.e(TAG, "構造輪子");
    }

    @Override
    protected void setEngine(String engine) {
        Log.e(TAG, "構造發動機");
    }

    @Override
    protected void setLampBulb(String lampBulb) {
        Log.e(TAG, "構造車燈");
    }
}

我們構造了兩種類型的小汽車:奔馳和豐田。同理,也可以以抽象類爲基準,生產出各種各樣類型的小汽車。

構建小汽車的工廠標準

由於我們生成小汽車是需要工廠的,不同的汽車工廠標準都是一樣的:生產出汽車。

public abstract class AbsFactory {
    public abstract <T extends AbsCar> T createProduct(Class<T> mClass);
}

現在創建工廠的標準有了,該創建工廠了

創建工廠實現類

public class ConcreteCarFactory extends AbsFactory {

    //***********************方法1*************************//
    public ConcreteBenzCar createBenz() {
        ConcreteBenzCar car = new ConcreteBenzCar();
        //TODO: 構造
        return car;
    }

    public ConcreteToyotaCar createToyota() {
        ConcreteToyotaCar car = new ConcreteToyotaCar();
        //TODO:構造
        return car;
    }

    //***********************方法2*************************//
    @Override
    public <T extends AbsCar> T createProduct(Class<T> mClass) {
        T object = null;
        try {
            object = (T) Class.forName(mClass.getName()).newInstance();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        }
        return object;
    }
}

上文定義了兩種方法

  1. 直接創建產品
  2. 通過反射創建產品

實際上關於使用工廠模式,我覺得還是得根據項目實際出發的。

有的人說:Activity的onCreate方法的調用就屬於工廠模式,但是我是在看不出來。關於Activity的啓動流程分析博客:
Android進階3:Activity源碼分析(1) —— Activity啓動流程(8.0)

源碼地址:
GitHub示例源碼

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章