設計模式二: 工廠方法(Factory Method)
阿新 • • 發佈:2018-08-31
get out 抽象工廠 子類 定義 結構 新產品 bre 創建對象
設計模式二: 工廠方法(Factory Method)
簡介
工廠方法模式是創建型模式的一種, 核心結構有四個角色: 抽象工廠,具體工廠,抽象產品,具體產品;
實現層面上,該模式定義一個創建產品的接口,將實際創建工作推遲到具體工廠類實現, 一個產品對應一個工廠, 這樣的好處是當有新產品引入時可以不修改具體的工廠角色.
意圖
定義了一個創建對象的接口,但由子類決定要實例化哪個類。工廠方法把實例化操作推遲到子類。
類圖
實現
以汽車舉例. 按照本模式核心的四個角色分別定義, 並增加模式調用角色(此處順便提一下簡單工廠模式, 比較簡單, 具體實現參看代碼).
- 抽象產品, 定義接口
Car
/** * 汽車接口 */ public interface Car { /** * 開車 */ void run(); }
- 抽象工廠
CarFactory
/**
* 汽車工廠接口
*/
public interface CarFactory {
/**
* 生產汽車
* @return 實現Car接口的類實例
*/
Car getCar();
}
- 具體產品
BMWCar
,QQCar
/** * BMW 汽車實現類 */ public class BMWCar implements Car { public void run() { System.out.println("BMW run..."); } } /** * QQ 汽車實現類 */ public class QQCar implements Car { public void run() { System.out.println("QQ run..."); } }
- 具體工廠
BMWFactory
,QQFactory
/**
* BMW 汽車工廠實現
*/
public class BMWFactory implements CarFactory {
public Car getCar() {
return new BMWCar();
}
}
/**
* QQ 汽車工廠實現
*/
public class QQFactory implements CarFactory {
public Car getCar() {
return new QQCar();
}
}
- 調用類
Client
/**
* 調用方角色
*/
public class Client {
/**
* 調用演示
*/
public void drive(){
CarFactory bmwFactory = new BMWFactory();
Car bmwCar = bmwFactory.getCar();
bmwCar.run();
CarFactory qqFactory = new QQFactory();
Car qqCar = qqFactory.getCar();
qqCar.run();
Car car = getCarByType(1);
if (car!=null){
car.run();
}
car = getCarByType(2);
if (car!=null){
car.run();
}
}
/**
* 簡單工廠實現, 通過傳入的參數返回具體的汽車
* @param carType
* @return
*/
public Car getCarByType(int carType){
Car car = null;
switch (carType){
case 1:
CarFactory bmwFactory = new BMWFactory();
Car bmwCar = bmwFactory.getCar();
car = bmwCar;
break;
case 2:
CarFactory qqFactory = new QQFactory();
Car qqCar = qqFactory.getCar();
car = qqCar;
break;
}
return car;
}
}
總結
優點: 1. 隱藏產品創建細節,我們只需要關系具體產品對應的具體工廠; 2. 完全符合設計模式"開閉"原則,當有新產品加入時只需要實現對應的工廠類;
缺點: 產品種類太多時維護難度增加.
設計模式二: 工廠方法(Factory Method)