以下為工廠模式的詳解,包括簡單工廠,普通工廠模式,抽象工廠。 引子: 假設有一個交通工具公司,生產自行車,汽車,飛機等,現要銷售該公司的產品,要怎麼設計呢? 在交通工具商店中加一個if else判斷如果是自行車就實例化(new)一個自行車,如果是汽車就實例化(new)一個汽車嗎,當然不是,這樣的話如果將來又加了多種交通工具那要更改每一個商店的代碼,這樣的話更改太多,我們應該把這部分可能變更的代碼封裝到另一個對象中,這個對象只管生產何種交通工具,要獲得交通工具就用它。 簡單工廠: 類圖: 設計: 復制代碼 /** * 抽像的交通工具類,裡面有生產交通工具的過程方法(控制生產過程) * @author Homg * */ public abstract class Vehicle { public abstract void produceComponent(); public abstract void assemble(); public abstract void test(); } 復制代碼 具體產品類,其他具體產品類(bike,plane)省略,完整代碼在文章的最下方有下載地址: 復制代碼 /** * 具體的產品,繼承自抽象類,以用被工廠生產出來 * @author Homg * */ public class Car extends Vehicle{ @Override public void produceComponent() { // TODO Auto-generated method stub System.out.println("生產汽車零件"); } @Override public void assemble() { // TODO Auto-generated method stub System.out.println("組裝成汽車"); } @Override public void test() { // TODO Auto-generated method stub System.out.println("測試汽車性能"); } } 復制代碼 復制代碼 /** * 簡單交通工具工廠,這是唯一new具體交通工具的地方 * * @author Homg * */ public class SimpleVehicleFactory { // 該方法也可以是靜態的(靜態工廠) public Vehicle createVehicle(String type) { Vehicle vehicle = null; if ("bike".equals(type)) { vehicle = new Bike(); } else if ("car".equals(type)) { vehicle = new Car(); } else if ("plane".equals(type)) { vehicle = new Plane(); } //可以設置默認產品以免為null return vehicle; } } 復制代碼 復制代碼 /** * 銷售交通工具,工廠的使用者。 * * @author Homg * */ public class VehicleStore { // 工廠的引用,從構造函數中獲得 private SimpleVehicleFactory factory; public VehicleStore(SimpleVehicleFactory factory) { this.factory = factory; } // 通過傳入訂單的類型來獲得相應的產品,不需要實例化(new)任何一個具體類,全部通過createVehicle()來獲得。 public Vehicle orderVehicle(String type) { Vehicle vehicle; vehicle = factory.createVehicle(type); vehicle.produceComponent(); vehicle.assemble(); vehicle.test(); return vehicle; } } 復制代碼 測試: 復制代碼 public static void main(String[] args) { SimpleVehicleFactory factory = new SimpleVehicleFactory(); VehicleStore vehicleStore = new VehicleStore(factory); // 依次生產三種交通工具 Vehicle vehicle1 = vehicleStore.orderVehicle("car"); System.out.println("-------------------------------------"); Vehicle vehicle2 = vehicleStore.orderVehicle("bike"); System.out.println("-------------------------------------"); Vehicle vehicle3 = vehicleStore.orderVehicle("plane"); } 復制代碼 運行結果: 生產汽車零件 組裝成汽車 測試汽車性能 ------------------------------------- 生產自行車零件 組裝成自行車 測試自行車性能 ------------------------------------- 生產飛機零件 組裝成飛機 測試飛機性能 ˙☆`·.·˙˙`·..·˙˙`·..·˙☆`·.·˙˙`·..·˙☆˙˙☆`·.·˙˙`·..·˙˙`·..·˙☆`·.·˙˙`·..·˙☆˙˙☆`·.·˙˙`·..·˙˙`·..·˙☆`·.·˙˙`·..·˙☆˙ 以後如果有新的交通工具要生產,只需要更改工廠類一處即可,商店類中不需要實例化任何一個具體的交通工具類,實例化(new)操作都放到工廠類的方法中。工廠類中的創建方法也可以改成靜態的(靜態工廠),這樣可以不用實例化對象來使用工廠方法。