程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> OO之工廠模式

OO之工廠模式

編輯:C++入門知識

以下為工廠模式的詳解,包括簡單工廠,普通工廠模式,抽象工廠。   引子:          假設有一個交通工具公司,生產自行車,汽車,飛機等,現要銷售該公司的產品,要怎麼設計呢?          在交通工具商店中加一個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)操作都放到工廠類的方法中。工廠類中的創建方法也可以改成靜態的(靜態工廠),這樣可以不用實例化對象來使用工廠方法。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved