《Android原始碼設計模式解析與實戰》讀書筆記(六) 《Android原始碼設計模式解析與實戰》PDF資料下載
一、抽象工廠模式簡介
1.1、定義
為建立一組相關或者是相互依賴的物件提供一個介面,而不需要指定它們的具體類。
1.2、使用場景
一個物件族有相同的約束時可以使用抽象工廠模式。 舉個例子: Android、iOS、Window Phone下都有簡訊軟體和撥號軟體,兩者都屬於Software軟體的範疇,但是,他們所在的作業系統平臺不一樣,即便是同一家公司出品的軟體,其程式碼的實現邏輯也是不同的,這時候就可以考慮使用抽象工廠方法模式來產生Android、iOS、Window Phone下的簡訊軟體和撥號軟體。
二、抽象工廠方法模式的簡單實現
public abstract class CarFactory {
/**
* 生產輪胎
* @return
*/
public abstract ITire createTire();
/**
* 生產發動機
* @return
*/
public abstract IEngine createEngine();
/**
* 生產製動系統
* @return
*/
public abstract IBrake createBrake();
}
複製程式碼
為每一種零部件產品定義一個介面
public interface ITire {
/**
* 輪胎
*/
void tire();
}
複製程式碼
public class NormalTire implements ITire {
@Override
public void tire() {
System.out.println("普通輪胎");
}
}
複製程式碼
public class SUVTire implements ITire {
@Override
public void tire() {
System.out.println("越野輪胎");
}
}
複製程式碼
public interface IEngine {
/**
* 發動機
*/
void engine();
}
複製程式碼
public class DomesticEngine implements IEngine {
@Override
public void engine() {
System.out.println("國產發動機");
}
}
複製程式碼
public class ImportEngine implements IEngine {
@Override
public void engine() {
System.out.println("進口發動機");
}
}
複製程式碼
public interface IBrake {
/**
* 制動系統
*/
void brake();
}
複製程式碼
public class NormalBrake implements IBrake {
@Override
public void brake() {
System.out.println("普通制動");
}
}
複製程式碼
public class SeniorBrake implements IBrake {
@Override
public void brake() {
System.out.println("高階制動");
}
}
複製程式碼
//Q3工廠類
public class Q3Factory extends CarFactory {
@Override
public ITire createTire() {
return new NormalTire();
}
@Override
public IEngine createEngine() {
return new DomesticEngine();
}
@Override
public IBrake createBrake() {
return new NormalBrake();
}
}
複製程式碼
//Q7工廠類
public class Q7Factory extends CarFactory {
@Override
public ITire createTire() {
return new SUVTire();
}
@Override
public IEngine createEngine() {
return new ImportEngine();
}
@Override
public IBrake createBrake() {
return new SeniorBrake();
}
}
複製程式碼
//構造一個生產Q3的工廠
CarFactory factoryQ3 = new Q3Factory();
factoryQ3.createTire().tire();
factoryQ3.createEngine().engine();
factoryQ3.createBrake().brake();
System.out.println("-----------------------------------------------------");
CarFactory factoryQ7 = new Q7Factory();
factoryQ7.createTire().tire();
factoryQ7.createEngine().engine();
factoryQ7.createBrake().brake();
複製程式碼
輸出如下:
三、總結
3.1、優點
- 分離介面與實現,客戶端使用抽象工廠來建立需要的物件,而客戶端根本就不知道具體的實現是誰,客戶端只是面向產品的介面程式設計而已,使其從具體的產品實現中解耦,同時基於介面與實現的分離,使抽象該工廠方法模式在切換產品類時更加靈活、容易。
3.2、缺點
- 類檔案的爆炸性增加
- 不太容易擴充套件新的產品類,因為每當增加一個產品類就需要修改抽象工廠,那麼所有的具體工廠類均會被修改。