1. 程式人生 > >設計模式二: 工廠方法(Factory Method)

設計模式二: 工廠方法(Factory Method)

get out 抽象工廠 子類 定義 結構 新產品 bre 創建對象

設計模式二: 工廠方法(Factory Method)

簡介

工廠方法模式是創建型模式的一種, 核心結構有四個角色: 抽象工廠,具體工廠,抽象產品,具體產品;

實現層面上,該模式定義一個創建產品的接口,將實際創建工作推遲到具體工廠類實現, 一個產品對應一個工廠, 這樣的好處是當有新產品引入時可以不修改具體的工廠角色.

意圖

定義了一個創建對象的接口,但由子類決定要實例化哪個類。工廠方法把實例化操作推遲到子類。

類圖

技術分享圖片

實現

以汽車舉例. 按照本模式核心的四個角色分別定義, 並增加模式調用角色(此處順便提一下簡單工廠模式, 比較簡單, 具體實現參看代碼).

  1. 抽象產品, 定義接口 Car
/**
 * 汽車接口
 */
public interface Car {

    /**
     * 開車
     */
    void run();

}
  1. 抽象工廠 CarFactory
/**
 * 汽車工廠接口
 */
public interface CarFactory {

    /**
     * 生產汽車
     * @return 實現Car接口的類實例
     */
    Car getCar();

}
  1. 具體產品 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...");
    }

}
  1. 具體工廠 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();
    }

}
  1. 調用類 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)