1. 程式人生 > >大話設計模式(一)簡單工廠模式

大話設計模式(一)簡單工廠模式

簡單工廠模式就是解決不同場景下例項化物件的問題。

問題場景:做一個簡單的計算器功能,實現加減乘除的功能,要實現這個功能很簡單,但是卻又要使用到面向物件的方法,降低程式的耦合度,符合開閉原則,就沒有想象中那麼簡單,demo如下:

  • 首先建立一個抽象的父類 Calculate,這個抽象的父類有一個計算的方法,這個方法是需要兩個引數,而具體的子類的實現是由子類去做的,這樣耦合度就降低了,也符合了開閉原則,想要增加計算方法的話,直接繼承Calculate類,然後實現doCalulate方法就行了。
package domian;

public abstract class
Calculate { public abstract double doCalculate(double num1,double num2); }
  • 加的類
package domian;

public class Add extends Calculate {

    @Override
    public double doCalculate(double num1, double num2) {
        return num1 + num2;
    }

}
  • 減的類
package domian;

public
class Minus extends Calculate { @Override public double doCalculate(double num1, double num2) { // TODO Auto-generated method stub return num1 - num2; } }
  • 乘的類
package domian;

public class Ride extends Calculate {

    @Override
    public double doCalculate(double
num1, double num2) { // TODO Auto-generated method stub return num1 * num2; } }
  • 除的類
package domian;

public class Divide extends Calculate {

    @Override
    public double doCalculate(double num1, double num2) {
        // TODO Auto-generated method stub
        double result = 0;
        try {
            result = num1 / num2;
        }catch(Exception e) {
            e.printStackTrace();
            return 0;
        }
        return num1 / num2;
    }

}
  • 降低了程式碼的耦合度之後呢,要考慮的問題是怎麼將計算類來進行例項化,因為不知道具體要例項化子類中的哪個,那麼就需要一個簡單的物件工廠來產生例項化物件。
package domian;

public class CalculateFactory {

    public static Calculate getCalculate(String operate) {

        Calculate calculate = null;

        switch (operate) {
        case "+":
            calculate = new Add();
            break;
        case "-":
            calculate = new Minus();
            break;
        case "*":
            calculate = new Ride();
            break;
        case "/":
            calculate = new Divide();
            break;
        default:
            break;
        }
        return calculate;
    }

}

這樣我麼就只需要呼叫工廠方法並傳入想要例項化的類就可以呼叫了,想要增加方法的話,只需要改動工廠就行了。

package domian;

public class Test {

    public static void main(String[] args) {
        Calculate calculate = CalculateFactory.getCalculate("*");
        double re = calculate.doCalculate(1, 2);
        System.out.println(re);
    }

}