簡單工廠模式

以簡單的計算器實現爲例。

一、普通方法實現簡單計算器。

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		double NumA;
		double NumB;
		String sign;
		NumA = scan.nextDouble();
		NumB = scan.nextDouble();
		sign = scan.next();
		double result = 0;
		switch (sign) {
		case "+":
			result = NumA + NumB;
			break;
		case "-":
			result = NumA - NumB;
			break;
		case "*":
			result = NumA * NumB;
			break;
		case "/":
			if (NumB != 0) {
				result = NumA / NumB;
			} else {
				System.out.println("除數不能爲0");
			}
			break;
		default:
			break;
		}
		//return result;
	}

二、用面向對象的思想去改進代碼--業務邏輯與界面邏輯分開,使他們的耦合度下降;

Operation預算類:

public static double Operation(double NumA, double NumB, String operate) {

		double result = 0;
		switch (operate) {
		case "+":
			result = NumA + NumB;
			break;
		case "-":
			result = NumA - NumB;
			break;
		case "*":
			result = NumA * NumB;
			break;
		case "/":
			if (NumB != 0) {
				result = NumA / NumB;
			} else {
				System.out.println("除數不能爲0");
			}
			break;
		default:
			break;
		}
		return result;
	}

客戶端代碼:

public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		double NumA;
		double NumB;
		String sign;
		NumA = scan.nextDouble();
		NumB = scan.nextDouble();
		sign = scan.next();
		System.out.println(Operation(NumA, NumB, sign));
	}

上面的代碼雖然實現了面向對象中的封裝,但是如果要添加一種計算方式(如:開根運算)還不是很方便,添加一個case的話,其餘的運算也得參與編譯,使代碼存在被二次修改的風險。

三、用繼承和多態進一步解耦;

1.封裝運算類;

public class Operation {
	private double NumA;
	private double NumB;
	public double getNumA() {
		return NumA;
	}
	public void setNumA(double numA) {
		NumA = numA;
	}
	public double getNumB() {
		return NumB;
	}
	public void setNumB(double numB) {
		NumB = numB;
	}
  public double GetResult() {

	  double result  = 0;
	  return result;
}
}

2.加減乘除類(繼承運算類);

public class AddOperation extends Operation{

	@Override
	public double GetResult() {

		double result = 0;
		result = getNumA() + getNumB() ;
		return result;
	}

public class SubOperation extends Operation {

	@Override
	public double GetResult() {
            double result = 0;
            result = getNumA() - getNumB();
            return result;
	}
public class MulOperation extends Operation{

	@Override
	public double GetResult() {

		double result = 0;
		result = getNumA() * getNumB();
		return result;

	}

	
}

public class DivOperation extends Operation{

	@Override
	public double GetResult() {
          double result = 0;
          if (getNumB()==0)
			try {
				throw new Exception("除數不能爲0;");
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
        	  result = getNumA() / getNumB();
        	  return result;
		
	}

	
}
3.簡單工廠類(用一個單獨的類來創造容易變化的地方的實例過程),用多態確定選擇的運算。

public class OperationFactory {

	public static Operation createOperation(String operate) {

		Operation oper = null;
		switch (operate) {
		case "+":
			oper = new AddOperation();
			break;
		case "-":
			oper = new SubOperation();
			break;
		case "*":
			oper = new MulOperation();
			break;
		case "/":
			oper = new DivOperation();
			break;
		default:
			break;
		}
		return oper;
	}
}
客戶端代碼

public class Main {
	public static void main(String[] args) {
		Operation oper;
		oper = OperationFactory.createOperation("+");
		oper.setNumA(2);
		oper.setNumB(3);
		double result = oper.GetResult();
		System.out.println(result);
	}

}

經過上述修改的簡單計算器運用面向對象思想,實現封裝、繼承、多態等特性,達到了代碼可複用、可擴展、靈活性好的目的。

四、UML圖






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