設計模式 --- 抽象工廠模式
阿新 • • 發佈:2018-11-22
1.定義
為建立一組相關或者相互依賴的物件提供一個介面,而不需要指定他們的具體類。
2.使用場景
一個物件族有相同的約束時可以使用抽象工廠模式。例如之前工廠方法模式的汽車組裝例子,Q3、Q5、Q7都是同一個車系,但是零部件差別很大,Q3發動機是國產的而Q7是原裝進口的,Q3的輪胎是普通輪胎,Q7是全尺寸越野輪胎等等。
3.簡單實現
還是以汽車生產為例,Q3、Q7都是同一系列車,但是發動機、輪胎、制動系統都是不同的產品型別。
//定義輪胎的介面 interface ITire{ void tire(); } //定義一個普通輪胎 class NormalTire implements ITire{ @Override public void tire() { System.out.println("普通輪胎"); } } //定義一個越野輪胎 class SUVTire implements ITire{ @Override public void tire() { System.out.println("越野輪胎"); } } //定義發動機的介面 interface IEngine{ void engine(); } //國產發動機 class DomesticEngine implements IEngine{ @Override public void engine() { System.out.println("國產發動機"); } } //進口發動機 class ImportEngine implements IEngine{ @Override public void engine() { System.out.println("進口發動機"); } } //定義制動系統介面 interface IBrake{ void brake(); } //普通制動 class NormalBrake implements IBrake{ @Override public void brake() { System.out.println("普通制動"); } } //高階制動 class SeniorBrake implements IBrake{ @Override public void brake() { System.out.println("高階制動"); } } //抽象車廠 abstract class CarFactory{ //生產輪胎 public abstract ITire createTire(); //生產發動機 public abstract IEngine createEngine(); //生產製動系統 public abstract IBrake createBrake(); } //生產Q3汽車 class Q3 extends CarFactory{ @Override public ITire createTire() { //裝配普通輪胎 return new NormalTire(); } @Override public IEngine createEngine() { //裝配國產發動機 return new DomesticEngine(); } @Override public IBrake createBrake() { //裝配普通制動系統 return new NormalBrake(); } } //生產Q7 class Q7 extends CarFactory{ @Override public ITire createTire() { //裝配越野輪胎 return new SUVTire(); } @Override public IEngine createEngine() { //進口發動機 return new ImportEngine(); } @Override public IBrake createBrake() { //高階制動系統 return new SeniorBrake(); } } public class AbsFactoryMode { public static void main(String[] args) { //構造一個Q3工廠 Q3 q3 = new Q3(); q3.createEngine().engine(); q3.createTire().tire(); q3.createBrake().brake(); //構造Q7工廠 Q7 q7 = new Q7(); q7.createTire().tire(); q7.createEngine().engine(); q7.createBrake().brake(); } }
輸出結果:
4.小結
優點:介面實現相分離,客戶端只是面向介面程式設計,從具體的實現解耦。
缺點:檔案類增加,不太容易拓展新產品,增加一個產品就需要修改抽象工廠,那麼所有的具體工廠類均會被修改。