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