大白話抽象工廠模式(Abstract Factory Pattern)

實例分析

大白話工廠方法模式(Factory Method)一文中,咱們講解了日產4S店工廠規模的擴大,建立了針對不一樣車型的工廠,減小了工廠的工做內容,提升了效率。下面咱們繼續以4S店的故事討論抽象工廠模式。
爲了知足各個階層的客戶,日產公司推出了豪華系列品牌英菲尼迪,並且爲了吸引客戶購買,購車贈送行車記錄儀,購買日產汽車贈送日產行車記錄儀。購買英菲尼迪汽車贈送英菲尼迪行車記錄儀。php

經過上面的描述咱們引出產品族和等級結構的定義。
產品族:即來自一個家族,好比英菲尼迪汽車和英菲尼迪行車記錄儀都來自英菲尼迪家族,日產汽車和日產行車記錄儀都來自日產家族。
等級結構:能夠理解爲相同的產品,好比英菲尼迪汽車和日產汽車處於同一個等級結構,英菲尼迪行車記錄儀和日產行車記錄儀處於同一個等級結構。html

如今假設工廠分爲日產工廠和英菲尼迪工廠,且汽車和行車記錄儀都只有一種型號。日產工廠須要生產相同產品族的日產汽車和日產行車記錄儀。英菲尼迪工廠須要生產相同產品族的英菲尼迪汽車和英菲尼迪行車記錄儀。java

經過對比,發現和工廠方法模式的區別爲:
工廠方法模式針對的是一個產品等級結構,而抽象工廠模式則須要面對多個產品等級結構設計模式

代碼以下:
代碼片斷1 汽車父類ide

/**
 * 汽車的父類
 * @author coderzcr
 */
public abstract class Car {
    String name;
    void printCar(){
        System.out.println(name+"汽車已製造完成");
    }
}

代碼片斷2 日產汽車this

/**
 * 日產汽車
 * @author coderzcr
 */
public class NissanCar extends Car {
    NissanCar(){
        this.name = "日產";
    }
}

代碼片斷3 英菲尼迪汽車設計

/**
 * 英菲尼迪汽車
 * @author coderzcr
 */
public class InfinitiCar extends Car {
    InfinitiCar(){
        this.name = "英菲尼迪";
    }
}

代碼片斷4 行車記錄儀父類3d

/**
 * 行車記錄儀父類
 * @author coderzcr
 */
public abstract class DVR {
    String name;
    void printDVR(){
        System.out.println(name+"行車記錄儀已製造完成");
    }
}

代碼片斷5 日產行車記錄儀code

/**
 * 日產行車記錄儀
 * @author coderzcr
 */
public class NissanDVR extends DVR{
    NissanDVR(){
        this.name = "日產";
    }
}

代碼片斷6 英菲尼迪行車記錄儀htm

/**
 * 英菲尼迪行車記錄儀
 * @author coderzcr
 */
public class InfinitiDVR extends DVR {
    InfinitiDVR(){
        this.name = "英菲尼迪";
    }

}

代碼片斷7 工廠父類

/**
 * 工廠父類
 * @author coderzcr
 */
public abstract class AbstractFactory {
    abstract Car getCar();
    abstract DVR getDVR();
}

代碼片斷8 日產工廠

/**
 * 日產工廠
 * @author coderzcr
 */
public class NissanFactory extends AbstractFactory {
    @Override
    Car getCar() {
        return new NissanCar();
    }

    @Override
    DVR getDVR() {
        return new NissanDVR();
    }
}

代碼片斷9 英菲尼迪工廠

/**
 * 英菲尼迪工廠
 * @author coderzcr
 */
public class InfinitiFactory extends AbstractFactory {
    @Override
    Car getCar() {
        return new InfinitiCar();
    }

    @Override
    DVR getDVR() {
        return new InfinitiDVR();
    }
}

圖1 類圖
實例分析類圖

抽象工廠模式定義

抽象工廠模式(Abstract Factory Pattern):提供一個建立一系列相關或相互依賴對象的接口,而無須指定它們具體的類。抽象工廠模式又稱爲Kit模式,屬於對象建立型模式。

抽象工廠模式結構

圖2抽象工廠模式類圖
實例分析類圖

抽象工廠模式包含以下角色:

  • AbstractFactory:抽象工廠
  • ConcreteFactory:具體工廠
  • AbstractProduct:抽象產品
  • Product:具體產品

抽象工廠模式分析

優勢分析

  • 抽象工廠模式隔離了具體類的生成,使得客戶並不須要知道什麼被建立。因爲這種隔離,更換一個具體工廠就變得相對容易。全部的具體工廠都實現了抽象工廠中定義的那些公共接口,所以只需改變具體工廠的實例,就能夠在某種程度上改變整個軟件系統的行爲。另外,應用抽象工廠模式能夠實現高內聚低耦合的設計目的,所以抽象工廠模式獲得了普遍的應用。
  • 當一個產品族中的多個對象被設計成一塊兒工做時,它可以保證客戶端始終只使用同一個產品族中的對象。這對一些須要根據當前環境來決定其行爲的軟件系統來講,是一種很是實用的設計模式。
  • 增長新的具體工廠和產品族很方便,無須修改已有系統,符合「開閉原則」。

    缺點分析

  • 在添加新的產品對象時,難以擴展抽象工廠來生產新種類的產品,這是由於在抽象工廠角色中規定了全部可能被建立的產品集合,要支持新種類的產品就意味着要對該接口進行擴展,而這將涉及到對抽象工廠角色及其全部子類的修改,顯然會帶來較大的不便。
  • 開閉原則的傾斜性(增長新的工廠和產品族容易,增長新的產品等級結構麻煩)。

    參考文獻

  1. 3. 抽象工廠模式(Abstract Factory) — Graphic Design Patterns
  2. 設計模式(三)抽象工廠模式 · 寫最好的設計模式專欄 · 看雲
相關文章
相關標籤/搜索