1. 程式人生 > >設計模式 --- 抽象工廠模式

設計模式 --- 抽象工廠模式

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.小結

優點:介面實現相分離,客戶端只是面向介面程式設計,從具體的實現解耦。

缺點:檔案類增加,不太容易拓展新產品,增加一個產品就需要修改抽象工廠,那麼所有的具體工廠類均會被修改。