設計模式學習筆記 ———— 簡單工廠模式

# 背景  程序員

  簡單工廠模式是不少程序員學習的第一個設計模式,由於其不但原理簡單並且易於上手,在平常工做的代碼中也常有體現。今天分享一個基於實現「加」、「減」、「乘」、「除」計算器的需求基於簡單工廠模式來實現。算法

# 錯誤示範設計模式

  在學習簡單工廠模式以前,遇到這種需求我是這樣實現的:ide

public static Double Calculator(Double num1, Double num2, String symbol) throws Exception {
        Double result = 0.0D;
        if (symbol == null || num1 == null || num2 == null) {
            return result;
        }
        switch (symbol) {
            case "+":
                result = num1 + num2;
                break;
            case "-":
                result = num1 - num2;
                break;
            case "*":
                result = num1 * num2;
                break;
            case "/":
                if (num2 == 0) {
                    throw new Exception("使用除法的時候分母不能爲0");
                }
                result = num1 / num2;
                break;
            default:{}

        }
        return result;
    }

  簡單來講是船艦一個方法,而後經過switch case 一個一個的去判斷,而後對比中的進行處理,後續若是有其餘判斷的話,就繼續在下面在增長case判斷。那麼這段代碼實現了需求了,是實現了,可是這段代碼是優秀的嗎?不是。爲何呢?例如如今客戶需求增長一個平方算法,咱們在case中增長這個算法,卻須要加減乘除的運算都得來參與編譯,在這個代碼的迭代過程當中,若是不當心對原有代碼進行了誤操做,會形成很糟糕的結果,尤爲是這個誤操做有可能還不會報錯……因此咱們應該把加減乘除等運算進行分離,修改其中一個不會影響另外的幾個,增長平方算法也不影響其餘代碼。學習

  聲明父類測試

@Data
public abstract class Operation {

    private double num1;
    private double num2;

    protected abstract double getResult();
   
}

  建立多個計算類用於繼承父類並重寫getResult方法,這裏我分別建立了加減乘除四個類來繼承Operation類,並重寫getResult()方法spa

class OperationAdd extends Operation{

    @Override
    protected double getResult() {
        return getNum1() + getNum2();
    }
}

class OperationSub extends Operation {

    @Override
    protected double getResult() {
        return getNum1() - getNum2();
    }
}

class OperationMul extends Operation {

    @Override
    protected double getResult() {
        return getNum1() * getNum2();
    }
}

class OperationDiv extends Operation {

    @Override
    protected double getResult() {
        return getNum1() / getNum2();
    }
}

  此時,咱們只須要簡單的寫一個工程方法就能夠實現業務要求了。這裏只是實例代碼,不少細節判斷沒有加,若是是在生成環境中,首先入參確定要校驗是否爲null,若是爲null會報NPE,上面除法運算類中,應該對分母進行判斷,是否爲0等等……設計

class OperationFactory {
    public static Operation createOperation(String operate) {
        Operation operation;
        switch (operate) {
            case "+":
                operation = new OperationAdd();
                break;
            case "-":
                operation = new OperationSub();
                break;
            case "*":
                operation = new OperationMul();
                break;
            case "/":
                operation = new OperationDiv();
                break;
            default:{
                operation = new OperationAdd();
            }
        }
        return operation;
    }
}

  測試main方法code

public static void main(String[] args) {
        Operation operation = OperationFactory.createOperation("*");
        operation.setNum1(11d);
        operation.setNum2(1.2);
        System.out.println(operation.getResult());
}    

  返回結果:blog

13.2
相關文章
相關標籤/搜索