設計模式系列——3.簡單工廠模式與策略模式總結

孑立_發表於2020-12-03

設計模式系列——3.簡單工廠模式與策略模式總結

一、簡單工廠模式

設計模式系列——1.簡單工廠模式(總結與注意點)

二、策略模式

設計模式系列——2.策略模式

三.總結

使用(設計模式系列——2.策略模式)中父類子類延申從程式碼開始對比。

服務端程式碼

//使用策略模式
public class StrategyContext {
    private Marketing marketing;

    public StrategyContext(Marketing marketing) {
        this.marketing = marketing;
    }

    public Double getResPrice(Double price){
        return marketing.MarketingMethods(price);
    }
}
//使用簡單工廠模式
public class PriceFactory {
    public static Marketing getMarketing(String type){
        switch (type){
            case "無優惠":
                Marketing originalPrice = new OriginalPrice();
                return originalPrice;
            case "打八折":
                Marketing discount = new Discount(0.8);
                return discount;
            case "滿300減100":
                Marketing fullReduction = new FullReduction(300,100);
                return fullReduction;
            default:
                return null;
        }
    }
}

服務端
策略模式和簡單工廠模式都有一個抽象父類或介面,以及多個不同子類實現,即都是通過多型來實現不同子類的選取然後執行相應方法。
策略模式獨有context物件,本質是將各個子類例項作為引數傳遞進去,使用父類接收,然後通過此父類物件呼叫子類方法實現不同演算法。
簡單工廠模式獨有factory類,此類包含多個if判斷,根據入參type得到一個子類物件。然後使用此物件來完成方法呼叫。

客戶端程式碼
在這裡插入圖片描述

客戶端:
策略模式:
需要使用者知道Context物件和每個子類物件以及子類物件相關引數。
使用時,可以根據使用者需求動態的填入所以引數,完成具體演算法。
即在客戶端是根據使用者建立的子類物件來完成不同策略。
簡單工廠模式:
使用者只需要知道工廠類以及不同type即可在客戶端獲取父類物件,使用父類物件完成不同演算法。
即客戶端使用的是工廠類生產出來的子類例項來完成不同演算法。

總結:
工廠模式是建立型模式 關注物件建立,在客戶端傳入不同type通過工廠類建立出來的子類物件來完成具體演算法,同一個方法不同引數需要在工廠建立多個子類物件。即在客戶端通過工廠類得到父類物件呼叫子類方法。
策略模式是行為性模式 關注行為的封裝,在客戶端使用傳入的具體子類物件例項來完成具體演算法,同一個子類物件例項可以傳入不同的引數。即在客戶端建立context物件賦值不同子類物件,在context中完成子類物件的封裝,根據子類物件來實現不同的策略。

四.整合

簡單工廠模式,將演算法的選擇放在factory類中,即在服務端,客戶端只需要傳入type就能得到子類物件例項。 策略模式又將演算法的選擇權轉移到使用者手中,即由客戶端來建立不同的子類物件執行不同的策略。
//使用策略模式 和 工廠模式結合。
public class ContextAndFactory {

    private Marketing marketing;

    public  ContextAndFactory(String type) {
        switch (type){
            case "無優惠":
                marketing = new OriginalPrice();
                break;
            case "打八折":
                marketing = new Discount(0.8);
                break;
            case "滿300減100":
                marketing = new FullReduction(300,100);
                break;
        }
    }

    public Double getResPrice(Double price){
        return marketing.MarketingMethods(price);
    }
}

使用:
在這裡插入圖片描述
優點:
此時我們將演算法的選擇權再次轉移到服務端。
對比:
簡單工廠模式,客戶端需要知道工廠類和父類物件兩個類。
策略模式,客戶端需要知道context類和每個策略子類。
結合後:客戶端只需要知道centext類即可,內部使用工廠類來選擇對應的演算法。即所有的if判斷扔放在context類中的工廠內。


相關文章