簡單工廠模式又 叫靜態工廠方法模式(Static FactoryMethod Pattern),是通過專門定義一個類來負責創建其他類的實例,被創建的實例通常都具有共同的父類。
我們從一個例子展開,現在有一道面試題:使用java實現一個計算機控制檯程序,要求輸入數的運算,得到結果。
這道題目最原始的寫法:
public class Client {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("請輸入第一個數字:");
float num1 = in.nextFloat();
System.out.println("請輸入第二個數字:");
float num2 = in.nextFloat();
System.out.println("請輸入運算符號:");
String mark = in.next();
if("+".equals(mark)){
System.out.println("result : "+(num1+num2));
}else if("-".equals(mark)){
System.out.println("result : "+(num1-num2));
}else if("*".equals(mark)){
System.out.println("result : "+(num1*num2));
}else if("/".equals(mark)){
System.out.println("result : "+(num1/num2));
}
}
}
上面的寫法實現雖然簡單,但是卻沒有面向對象的特性,代碼拓展性差,顯然不是出題者想要考察的意圖。
那麼面向對象編程要如何在題中體現呢?
請看下面這段代碼:
abstract class Operation {
public abstract float getResult(float num1, float num2);
}
//加法運算
class Addition extends Operation {
@Override
public float getResult(float num1, float num2) {
return num1 + num2;
}
}
class Subtraction extends Operation {
@Override
public float getResult(float num1, float num2) {
return num1 - num2;
}
}
class Multiplication extends Operation {
@Override
public float getResult(float num1, float num2) {
return num1 * num2;
}
}
class Division extends Operation {
@Override
public float getResult(float num1, float num2) {
return num1 / num2;
}
}
class SimpleFactory {
public static Operation getOperation(String mark) {
Operation o = null;
switch (mark) {
case "+":
o = new Addition();
break;
case "-":
o = new Subtraction();
break;
case "*":
o = new Multiplication();
break;
case "/":
o = new Division();
break;
default:
break;
}
return o;
}
}
public class Client {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("請輸入第一個數字:");
float num1 = in.nextFloat();
System.out.println("請輸入第二個數字:");
float num2 = in.nextFloat();
System.out.println("請輸入運算符號:");
String mark = in.next();
System.out.println("result:"+count(num1,num2,mark));
}
public static float count(float num1,float num2,String mark) {
Operation o = SimpleFactory.getOperation(mark);
return o.getResult(num1, num2);
}
}
簡單工廠將對象的創建過程進行了封裝,用戶不需要知道具體的創建過程,只需要調用工廠類獲取對象即可。這種簡單工廠的寫法是通過switch-case來判斷對象創建過程的。在實際使用過程中,違背了 開放-關閉原則,當然有些情況下可以通過反射調用來彌補這種不足。那麼我們現在再來看看簡單工廠模式。
簡單工廠模式
這個模式本身很簡單而且使用在業務較簡單的情況下。一般用於小項目或者具體產品很少擴展的情況(這樣工廠類纔不用經常更改)。
它由三種角色組成:
工廠類角色:這是本模式的核心,含有一定的商業邏輯和判斷邏輯,根據邏輯不同,產生具體的工廠產品。如例子中SimpleFactory的類。
抽象產品角色:它一般是具體產品繼承的父類或者實現的接口。由接口或者抽象類來實現。如例中的Operation接口,其實也就是下面類圖中的AbstractProduct,就是名字不一樣而已。
具體產品角色:工廠類所創建的對象就是此角色的實例。在java中由一個具體類實現,如例子中的Addtion、Subtraction、Multiplication、Division類。
來用類圖來清晰的表示下的它們之間的關係: