工廠模式也是爲了構建一個新的對象,它是創建型模式的一種。
Android源碼設計模式——Build模式(應用:AlertDialog源碼分析)
上述是之前的Build模式,也是創建型模式一種,不懂的小夥伴可以回看下上篇博客。
工廠模式的定義
自我敘述:定義一個抽象產品類,然後繼承該抽象類形成很多的子類,在子類相當於是個:成品的產品,也就是我們真正要構建的產品。在定義一個抽象類,該抽象類內部:創建子類的公共方法定義。在定義真正的工廠實現類,繼承自該抽象類。
由此看下工廠模式的UML圖:
UML圖
上圖,分四塊:
- ABS Product —— 產品抽象類
- ConcreteProduct —— 產品實現類
- Abs Factory —— 抽象工廠類
- 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;
}
}
上文定義了兩種方法
- 直接創建產品
- 通過反射創建產品
實際上關於使用工廠模式,我覺得還是得根據項目實際出發的。
有的人說:Activity的onCreate方法的調用就屬於工廠模式,但是我是在看不出來。關於Activity的啓動流程分析博客:
Android進階3:Activity源碼分析(1) —— Activity啓動流程(8.0)
源碼地址:
GitHub示例源碼