建立型設計模式——抽象工廠模式

HunterArley發表於2019-01-24

《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、缺點

  • 類檔案的爆炸性增加
  • 不太容易擴充套件新的產品類,因為每當增加一個產品類就需要修改抽象工廠,那麼所有的具體工廠類均會被修改。

學海無涯苦作舟

我的微信公眾號

相關文章