初識-設計模式一 簡單工廠模式

示例一:

@Data  // 註解方式生成get set 方法  
abstract class Operation {  // 抽象類 ,繼承使用方法和字段
    private Double numberA;
    private Double numberB;
    public Double getResult(){
        return 0D;
    }
}
public class Add extends Operation { // 加法運算類
    public Double getResult(){
        return getNumberA() + getNumberB(); // 獲取父類屬性進行運算
    }
}
public class Subtraction extends Operation{ // 減法運算類
    public Double getResult(){
        return getNumberA() - getNumberB();
    }
}
public class OperationFactory {  // 調用類
    public static void main(String[] args) {
        String operator = "+";
        Operation add = createOperator(operator);  // 多態
        add.setNumberA(10D);
        add.setNumberB(10D);
        System.out.println(add.getResult());
    }


    // 不適用if else原因:switch case會生成一個跳轉表來指示實際的case分支的地址,而if…else卻需要遍歷條件分支直到命中條件, 效率switch更高,時間換空間
    private static Operation createOperator(String operator){ // 匹配算數運算符
        Operation operation = null;
        switch (operator){
            case "+":
                operation = new Add();
                break;
            case "-":
                operation = new Subtraction();
                break;
                default:
                    System.out.println("輸入有誤");
        }
        return operation;
    }
}

 示例二:

package com.mybatis.designpatterns.simplefactory.cash;

public class Cash {
    /**
     * 收銀系統:
     * 需求:1.客戶買賣東西正常收費
     *      2.打折收費
     *      3.返利
     * @param args
     */
    public static void main(String[] args) {
        String type = "正常收費";
        String type2 = "打折";
        String type3 = "促銷";
        CashSuper cash = cash(type2);
        System.out.println(cash.acceptCash(1000D));
    }

    private static CashSuper cash(String type){
        CashSuper cashSuper = null;
        switch (type){
            case "正常收費":
                cashSuper = new CashNormal();
                break;
            case "打折":
                cashSuper = new CashDiscount(0.8);
                break;
            case "促銷":
                cashSuper = new CashPromotion(300D,100D);
                break;
            default:
                System.out.println("輸入有誤");
        }
        return cashSuper;
    }
}
package com.mybatis.designpatterns.simplefactory.cash;

/**
 * 收費超類
 */
abstract class CashSuper {
    public abstract Double acceptCash(Double money);
}
package com.mybatis.designpatterns.simplefactory.cash;

/**
 * 促銷
 */
public class CashPromotion extends CashSuper{
    private Double promotionPrivate; // 促銷價格
    private Double promotionRebate;  // 返利

    public CashPromotion(Double promotionPrivate, Double promotionRebate) {
        this.promotionPrivate = promotionPrivate;
        this.promotionRebate = promotionRebate;
    }

    @Override
    public Double acceptCash(Double money) {
        if (money >= promotionPrivate){
            return money - money / promotionPrivate * promotionRebate;
        }
        return money; // 收原價
    }

}
package com.mybatis.designpatterns.simplefactory.cash;
/**
*
*原價
*
*/
public class CashNormal extends CashSuper {
    @Override
    public Double acceptCash(Double money) {
        return money;
    }
}
package com.mybatis.designpatterns.simplefactory.cash;

/**
 * 打折
 */
public class CashDiscount extends CashSuper{
    private Double discount  = 1D; //默認不打折
    public CashDiscount(Double discount) {
        this.discount = discount;
    }
    @Override
    public Double acceptCash(Double money){
        return money * discount;
    }
}

 感受:需掌握和靈活運用繼承及多態知識,代碼量感覺多了很多,真雞兒麻煩.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章