工廠模式,是用工廠方法代替new來創建對象的一種模式。通過這種模式使代碼更容易擴展,接下來我們以簡單計算器爲例爲說明。
一、需求分析
1、輸入操作A,操作數B及運算符“+,-,*,/”,然後根據運算符作相應的運算
2、返回運算結果
二、編碼前思考
通過什麼樣的方法使得我們的代碼易維護,易擴展,易複用?
這四種運算的共同點是:
a、都有2個操作數A,B
b、都返回計算結果
不同點是:計算方式不同
那麼,我們就可以把相同點封裝在一個父類Operator裏面,代碼如下:
public abstract class Operator { protected double operatorA; protected double operatorB; protected double result; private String[] opStr = new String[]{"+","-","*","/"}; public static class operator { public static final short ADD = 0; public static final short MINUS = 1; public static final short MUL = 2; public static final short DIV = 3; } public Operator(double a,double b) { this.operatorA = a; this.operatorB = b; } public abstract double getResult(); public void printf(short op) { System.out.println(this.operatorA + this.opStr[op]+this.operatorB+"="+this.result); } }
接下來就可以分別寫加、減、乘、除四個類來繼承Operator類。
加法類:
public class OperatorAdd extends Operator { public OperatorAdd(double a, double b) { super(a, b); // TODO Auto-generated constructor stub } @Override public double getResult() { this.result = this.operatorA + this.operatorB; this.printf(Operator.operator.ADD); return this.result; } }
減法類:
public class OperatorMinus extends Operator { public OperatorMinus(double a, double b) { super(a, b); // TODO Auto-generated constructor stub } @Override public double getResult() { this.result = this.operatorA - this.operatorB; this.printf(Operator.operator.MINUS); return this.result; } }
乘法類:
public class OperatorMul extends Operator { public OperatorMul(double a, double b) { super(a, b); // TODO Auto-generated constructor stub } @Override public double getResult() { this.result = this.operatorA * this.operatorB; this.printf(Operator.operator.MUL); return this.result; } }
除法類:
public class OperatorDiv extends Operator { public OperatorDiv(double a, double b) { super(a, b); // TODO Auto-generated constructor stub } @Override public double getResult() { if(this.operatorB == 0) { try { System.out.println("除數不能爲0"); throw new Exception(); } catch (Exception e) { e.printStackTrace(); } }else{ this.result = this.operatorA / this.operatorB; this.printf(Operator.operator.DIV); } return this.result; } }
工廠類來負責對應對象的初始化:
public class OperatorFactory { public static Operator operatorMake(double a,double b,short op) { Operator operator = null; switch(op) { case Operator.operator.ADD: operator = new OperatorAdd(a,b); break; case Operator.operator.MINUS: operator = new OperatorMinus(a,b); break; case Operator.operator.MUL: operator = new OperatorMul(a,b); break; case Operator.operator.DIV: operator = new OperatorDiv(a,b); break; } return operator; } }
測試:
public class MyOperator { public static void main(String[] args) { Operator op = null; //加法 op = OperatorFactory.operatorMake(33, 6, Operator.operator.ADD); op.getResult(); //減法 op = OperatorFactory.operatorMake(99, 82, Operator.operator.MINUS); op.getResult(); //乘法 op = OperatorFactory.operatorMake(23, 8, Operator.operator.MUL); op.getResult(); //除法 op = OperatorFactory.operatorMake(150, 3, Operator.operator.DIV); op.getResult(); } }
輸出效果:
33.0+6.0=39.0
99.0-82.0=17.0
23.0*8.0=184.0
150.0/3.0=50.0
如果還要其他運算,比如開根,平方等,則只需要繼承Operator類,然後在工廠類裏面加上相應的對象初始化即可。