工廠模式(簡單工廠模式)快速理解

July47發表於2020-10-20

工廠模式

一個工廠類根據傳入的引數,動態的決定應該建立哪一個產品類(產品類都繼承或實現於一個父類或介面),自動建立並返回例項

使用場景

工廠類負責建立的物件較少,呼叫者只知道傳入引數,對於如何建立物件的邏輯不關心

舉例

例子中展示的是輸入金額,計算實際應收金額

沒有使用工廠模式之前是這樣呼叫的:

        RebateCash rebateCash = new RebateCash(300,100);
        double result = rebateCash.acceptCash(300);
        System.out.println("result = " + result);

使用了之後,呼叫是這樣的:

        ICash cs = CashFactory.createCashAccept("打8折");
        double result = cs.acceptCash(300);
        System.out.println("result = " + result);

接下來檢視具體的程式碼:


/**
 * 現金工廠
 *
 * @author 遊四七
 * @date 2020/10/20
 */
public class CashFactory {

    /**
     * 建立cash
     *
     * @param type
     * @return
     */
    public static ICash createCashAccept(String type) {
        ICash cash = null;

        // 建立的物件可能需要很多步驟,這裡統一一個地方建立並返回物件
        switch (type) {
            case "正常收費":
                cash = new NormalCash();
            case "打8折":
                cash = new DiscountCash(8);
            case "滿300減100":
                cash = new RebateCash(300, 100);
            default:
                break;

        }
        return cash;
    }

}

/**
 * 計算金額的介面
 *
 * @author 遊四七
 * @date 2020/10/20
 */
public interface ICash {

    /**
     * 計算應收的費用
     *
     * @param money 接收的錢
     * @return 實際收的錢
     */
    double acceptCash(double money);
}

/**
 * 正常收費
 *
 * @author 遊四七
 * @date 2020/10/20
 */
public class NormalCash implements ICash{
    
    @Override
    public double acceptCash(double money) {
        return money;
    }
}

/**
 * 返利
 *
 * @author 遊四七
 * @date 2020/10/20
 */
public class RebateCash implements ICash {

    /**
     * 滿多少
     */
    private double moneyCondition;

    /**
     * 返利金額
     */
    private double rebateMoney;

    public RebateCash(double moneyCondition, double rebateMoney) {
        this.moneyCondition = moneyCondition;
        this.rebateMoney = rebateMoney;
    }

    @Override
    public double acceptCash(double money) {
        if (money >= moneyCondition) {
            return money - rebateMoney;
        }
        return money;
    }
}

/**
 * 打折
 *
 * @author 遊四七
 * @date 2020/10/20
 */
public class DiscountCash implements ICash {

    /**
     * 折扣率
     */
    private double moneyRebate;

    /**
     * 折扣率
     *
     * @param moneyRebate
     */
    public DiscountCash(double moneyRebate) {
        this.moneyRebate = moneyRebate;
    }

    @Override
    public double acceptCash(double money) {

        return money * moneyRebate;
    }
}

關係圖:
在這裡插入圖片描述

角色說明

  • 工廠類角色(CashFactory):本模式的核心,含有一定的商業邏輯和判斷邏輯,用來建立產品
  • 抽象產品角色(ICash):一般指具體產品繼承的父類或實現的介面
  • 具體產品角色(DiscountCash、NormalCash...):工廠類建立的就是這個角色的例項,實現抽象產品角色

優缺點

優點

  • 呼叫者可以從直接建立具體產品物件的尷尬局面中擺脫出來
  • 與外界隔離開來,耦合性低

缺點

  • 所有建立類都集中在工廠類,一旦增加或減少某個產品,需要頻繁修改工廠類,無法動態擴充套件
  • 簡單工廠通常使用靜態方法,使得無法由子類繼承

相關文章