天天看點

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

工廠模式也是為了建構一個新的對象,它是建立型模式的一種。

Android源碼設計模式——Build模式(應用:AlertDialog源碼分析)

上述是之前的Build模式,也是建立型模式一種,不懂的小夥伴可以回看下上篇部落格。

工廠模式的定義

自我叙述:定義一個抽象産品類,然後繼承該抽象類形成很多的子類,在子類相當于是個:成品的産品,也就是我們真正要建構的産品。在定義一個抽象類,該抽象類内部:建立子類的公共方法定義。在定義真正的工廠實作類,繼承自該抽象類。

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

UML圖

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

上圖,分四塊:

  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示例源碼

繼續閱讀