工廠模式也是為了建構一個新的對象,它是建立型模式的一種。
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示例源碼