設計模式【00】簡單工廠模式

簡單工廠模式又叫靜態工廠方法,簡單且常用,但不屬於GOF23中設計模式,算是工廠方法模式的入門。

簡單工廠模式專門定義一個類(工廠)來負責創建其他類的實例,這個工廠可以根據參數的不同返回不同類的實例。被創建的實例通常具有共同的父類。

示例:

運算工廠類:

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

運算類:

public abstract class Operation {

    private double numberA;
    private double numberB;

    public double getNumberA() {
        return numberA;
    }

    public void setNumberA(double numberA) {
        this.numberA = numberA;
    }

    public double getNumberB() {
        return numberB;
    }

    public void setNumberB(double numberB) {
        this.numberB = numberB;
    }

    public abstract double getResult();//強制子類實現該方法
}

加減乘除類繼承Operation類並重寫getResult方法,其餘省略。

public class OperationAdd extends Operation {
    @Override
    public double getResult() {
        double result = getNumberA() + getNumberB();
        return result;
    }
}

計算器:

public class Caculator {
    public static void main(String[] args) {
        Operation oper = OperationFactory.createOperation("+");
        oper.setNumberA(1);
        oper.setNumberB(2);
        double result = oper.getResult();
        System.out.println("計算結果是   " + result);
    }
}

可以用反射改寫簡單工廠類,消除邏輯判斷。參數傳入要使用的子類的全類名。

public class OperationFactory {
    public static Operation createOperation(String operate) {
        Operation oper = null;
        try {
            oper = (Operation) Class.forName(operate).newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return oper;
    }
}

總結:

  • 優點:簡單工廠模式實現了對象的創建和使用的分離,當需要一個對象的時候,只需要傳入正確的參數,就可以獲得實例,而無需知道對象創建的細節。對象的創建和使用分離後,降低了系統的耦合度,使兩者修改起來都更加容易。比如上邊的例子中,需要加入平方等運算,只需要增加平方運算的子類,除了需要在工廠類中加入邏輯判斷代碼之外,不用去修改以前的代碼。
  • 缺點:工廠類不夠靈活,增加新的子類需要修改工廠類的邏輯判斷。若子類過多,工廠類的代碼將非常複雜。
  • 適用:工廠類負責創建的類的數量比較少;客戶端並不關心對象的創建過程。

 

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