抽象工廠(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