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