簡單工廠模式(Factory Pattern)
阿新 • • 發佈:2018-11-21
簡單工廠模式又 叫靜態工廠方法模式(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類。
來用類圖來清晰的表示下的它們之間的關係: