Java設計模式:Abstract Factory(抽象工廠)模式

概念定義

抽象工廠(Abstract Factory)模式提供一個建立一系列相關或相互依賴對象的接口,而無需指定它們具體的類。java

抽象工廠模式中,系統的產品有多於一個的產品族(一個產品族裏定義多個產品),而系統只消費其中某一族的產品。換句話說,抽象工廠建立一整套具備相互依賴或做用關係的產品(至少兩個產品),而工廠方法中的工廠只能建立單一系列的產品。ide

應用場景

  • 客戶端不須要知道它所建立的對象的類。
  • 須要一組對象共同完成某種功能時,而且可能存在多組對象完成不一樣功能的狀況。
  • 系統結構穩定,不會頻繁地增長對象。

示例代碼

抽象工廠模式由工廠接口(或抽象類)、一組實現工廠接口工廠類、一個產品接口(或抽象類)和一組實現產品接口的具體產品組成。設計

本節經過一個"喜聞樂見"的豪車系列,展現抽象工廠模式的實現。示例代碼以下(注意豪車有兩個產品 -- 引擎和娛樂系統):code

// 產品接口 - 引擎 //
public interface IEngine {
    void show();
}
// 若干具體的產品 - 寶馬與奔馳的引擎 //
public class BmwEngine implements IEngine {
    @Override
    public void show() { System.out.println("Bmw's engine"); }
}
public class BenzEngine implements IEngine {
    @Override
    public void show() { System.out.println("Benz's engine"); }
}

// 產品接口 - 娛樂系統 //
public interface IEntertainment {
    void show();
}
// 若干具體的產品 - 寶馬與奔馳的娛樂系統 //
public class BmwEntertainment implements IEntertainment {
    @Override
    public void show() { System.out.println("Bmw's entertainment"); }
}
public class BenzEntertainment implements IEntertainment {
    @Override
    public void show() { System.out.println("Benz's entertainment"); }
}

// 抽象工廠接口 //
public interface IFactory {
    public IEngine createEngine(); // 沒必要爲引擎和娛樂系統分別增長兩個工廠接口!
    public IEntertainment createEntertainment();
}
// 若干具體的工廠 - 爲車建立引擎和娛樂系統 //
public class BmwFactory implements IFactory { // 結合了工廠方法模式
    @Override
    public IEngine createEngine() { return new BmwEngine(); }
    @Override
    public IEntertainment createEntertainment() { return new BmwEntertainment(); }
}
public class BenzFactory implements IFactory {
    @Override
    public IEngine createEngine() { return new BenzEngine(); }
    @Override
    public IEntertainment createEntertainment() { return new BenzEntertainment(); }
}

客戶端經過以下方式調用:對象

IFactory bmwFactory = new BmwFactory();
bmwFactory.createEngine().show();
bmwFactory.createEntertainment().show();
IFactory benzFactory = new BenzFactory();
benzFactory.createEngine().show();
benzFactory.createEntertainment().show();

模式優缺點

抽象工廠模式的優勢以下:接口

  • 當一個產品族中的多個對象被設計成一塊兒工做時,它能保證客戶端始終只使用同一個產品族中的對象。

缺點以下:產品

  • 產品族擴展很是困難。增長一個系列的某一產品時,須要同時修改抽象工廠和具體工廠。

業界實踐

class

相關文章
相關標籤/搜索