設(shè)計(jì)模式之抽象工廠模式

定義

抽象工廠模式(Abstract Factory Pattern)是工廠方法模式的進(jìn)一步抽象,其英文原話"Provide an interface for creating families of related or dependent objects without specifying their concrete classes"。翻譯為以下:
為創(chuàng)建一組相關(guān)或者是相互依賴的對(duì)象提供一個(gè)接口,而不需要指定它們的具體實(shí)現(xiàn)類。

使用場景

一個(gè)對(duì)象族有相同的約束時(shí)可以使用抽象工廠模式。以車廠生產(chǎn)汽車零部件為例,A、B兩家車廠分別生產(chǎn)不同的輪胎、發(fā)動(dòng)機(jī)、制動(dòng)系統(tǒng)。雖然生產(chǎn)的零件不同,型號(hào)不同。但是根本上都有共同的約束,就是輪胎、發(fā)動(dòng)機(jī)、制動(dòng)系統(tǒng)。

代碼實(shí)現(xiàn)

輪胎相關(guān)類:

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("越野輪胎");
    }
}

發(fā)動(dòng)機(jī)相關(guān)類:

public interface IEngine {
    /**
     *發(fā)動(dòng)機(jī) 
     */
    void engine();
}
public class DomesticEngine implements IEngine{
    @Override
    public void engine() {
        System.out.println("國產(chǎn)發(fā)動(dòng)機(jī)");
    }
}
public class ImportEngine implements IEngine{
    @Override
    public void engine() {
        System.out.println("進(jìn)口發(fā)動(dòng)機(jī)");
    }
}

制動(dòng)系統(tǒng)相關(guān)類:

public interface IBrake {
    /**
     *制動(dòng)系統(tǒng) 
     */
    void brake();
}
public class NormalBrake implements IBrake{
    @Override
    public void brake() {
        System.out.println("普通制動(dòng)");
    }
}
public class SeniorBrake implements IBrake{
    @Override
    public void brake() {
        System.out.println("高級(jí)制動(dòng)");
    }
}

抽象車廠類:

public abstract class CarFactory {
    /**
     * 生產(chǎn)輪胎
     * 
     * @return 輪胎
     * */
    public abstract ITire createTire();

    /**
     * 生產(chǎn)發(fā)動(dòng)機(jī)
     * 
     * @return 發(fā)動(dòng)機(jī)
     * */
    public abstract IEngine createEngine();

    /**
     * 生產(chǎn)制動(dòng)系統(tǒng)
     * 
     * @return 制動(dòng)系統(tǒng)
     * */
    public abstract IBrake createBrake();

}

A車廠:

public class AFactory extends CarFactory{

    @Override
    public ITire createTire() {
        return new NormalTire();
    }

    @Override
    public IEngine createEngine() {
        return new DomesticEngine();
    }

    @Override
    public IBrake createBrake() {
        return new NormalBrake();
    }
}

B車廠:

public class BFactory 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 Client {
    public static void main(String[] args) {
        //A車廠
        CarFactory factoryA = new AFactory();
        factoryA.createTire().tire();
        factoryA.createEngine().engine();
        factoryA.createBrake().brake();
        System.out.println("---------------");
        //B車廠
        CarFactory factoryB = new BFactory();
        factoryB.createTire().tire();
        factoryB.createEngine().engine();
        factoryB.createBrake().brake();
    }
}

根據(jù)代碼實(shí)現(xiàn)來理解抽象模式的定義:

  • "為創(chuàng)建一組相關(guān)或者是相互依賴的對(duì)象提供一個(gè)接口" ,一組相關(guān)對(duì)象是NormalTire、SUVTire,提供一個(gè)接口是ITire;"而不需要指定它們的具體實(shí)現(xiàn)類"是在客戶端使用NormalTire和SUVTire這些類時(shí),不要知道它們是誰。

總結(jié)

抽象工廠模式和工廠方法模式區(qū)別:
抽象工廠模式相對(duì)于工廠方法模式來說,抽象工廠模式每個(gè)具體工廠可以生產(chǎn)一族產(chǎn)品(即多種產(chǎn)品);而工廠方法模式每個(gè)具體工廠只能生產(chǎn)一種產(chǎn)品。當(dāng)產(chǎn)品族中只有一種產(chǎn)品時(shí)抽象工廠模式退化成工廠方法模式。

缺點(diǎn):

  1. 每增加一個(gè)具體工廠類,并且產(chǎn)品類型有不同,會(huì)導(dǎo)致類文件的成倍增加;
  2. 不太容易擴(kuò)展新的產(chǎn)品類,因?yàn)槲覀冊(cè)黾右粋€(gè)產(chǎn)品類就需要修改抽象工廠,那么所有的具體工廠類均會(huì)被修改。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 抽象工廠模式(Abstract factory pattern) 抽象工廠模式(Abstract factory ...
    Airing閱讀 1,135評(píng)論 0 9
  • 抽象工廠模式 1.定義: 為創(chuàng)建一組相關(guān)或者相互依賴的對(duì)象提供一個(gè)接口,而不需要指定它們的具體類。 2.使用場景:...
    TangBuzhi閱讀 150評(píng)論 0 0
  • 楊澤平
    窗外白楊閱讀 363評(píng)論 0 4
  • 劉心武先生的某些紅學(xué)探討有過分之處,比如對(duì)秦可卿的推斷實(shí)在有點(diǎn)牽強(qiáng)。任何脫離文本的研究推論都是偽命題。紅樓夢(mèng)探討只...
    水鄉(xiāng)醉客閱讀 557評(píng)論 0 1
  • 清晨醒來,腦海里面一直出現(xiàn)一句話:“每個(gè)女人都極其珍貴,她們?cè)杏钪娴暮⒆?,她們能量如此流?dòng),她們就像大地一樣能承...
    禾旭閱讀 643評(píng)論 0 0