建立型設計模式——抽象工廠模式
《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();
輸出如下:
抽象工廠.png
三、總結
3.1、優點
- 分離介面與實現,客戶端使用抽象工廠來建立需要的物件,而客戶端根本就不知道具體的實現是誰,客戶端只是面向產品的介面程式設計而已,使其從具體的產品實現中解耦,同時基於介面與實現的分離,使抽象該工廠方法模式在切換產品類時更加靈活、容易。
3.2、缺點
- 類檔案的爆炸性增加
- 不太容易擴充套件新的產品類,因為每當增加一個產品類就需要修改抽象工廠,那麼所有的具體工廠類均會被修改。
學海無涯苦作舟
我的微信公眾號