工廠模式三姐妹中,簡單工廠無疑是最簡單的。無論多簡單的方法,放對了位置便是最佳實現,所以簡單工廠在特定情況下還是有應用市場的。 定義:簡單工廠模式是屬於創建型模式,又叫做靜態工廠方法(Static Factory Method)模式,但不屬於23種GOF設計模式之一。簡單工廠模式是由一個工廠對象決定 ...
工廠模式三姐妹中,簡單工廠無疑是最簡單的。無論多簡單的方法,放對了位置便是最佳實現,所以簡單工廠在特定情況下還是有應用市場的。
定義:簡單工廠模式是屬於創建型模式,又叫做靜態工廠方法(Static Factory Method)模式,但不屬於23種GOF設計模式之一。簡單工廠模式是由一個工廠對象決定創建出哪一種產品類的實例。
總感覺百度百科上的這種定義說了等於沒說。由於過於簡單,所以在解釋上會顯得更繁瑣,就像不能解釋為什麼1+1=2一樣。
UML類圖如下
具體實現中,產品類可以是介面(interface)或者是抽象類(abstract class),下麵沿用《大話設計模式》一書中的例子(簡單計算器的開發)加以說明。
首先是產品類,這裡是運算符類,兩個操作數參數和一個運算方法,此處用的是抽象類:
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(); }
具體產品衍生類,便是各個運算符的運算(加減乘除等),需要繼承或實現產品類:
public class OperationAdd extends Operation { @Override public double getResult() { return getNumberA() + getNumberB(); } } public class OperationSub extends Operation { @Override public double getResult() { return getNumberA() - getNumberB(); } } public class OperationMul extends Operation { @Override public double getResult() { return getNumberA() * getNumberB(); } } public class OperationDiv extends Operation { @Override public double getResult() { return getNumberA() / getNumberB(); } }
工廠類即是創建運算類的類
public class OperationFactory { public static Operation createOperation(String what) { switch (what) { case "+": return new OperationAdd(); case "-": return new OperationSub(); case "*": return new OperationMul(); case "/": return new OperationDiv(); default: return null; } } }
最後是客戶端,調用
import java.util.Scanner; public class POC { public static void main(String[] args) { coal(); } public static void coal() { try { double numberA, numberB; String opr; @SuppressWarnings("resource") Scanner sc = new Scanner(System.in); System.out.println("輸入第一個數字:"); String numberAStr = sc.next(); numberA = Double.parseDouble(numberAStr); System.out.println("輸入操作符:"); opr = sc.next(); System.out.println("輸入第二個數字:"); String numberBStr = sc.next(); numberB = Double.parseDouble(numberBStr); Operation operation = OperationFactory.createOperation(opr); operation.setNumberA(numberA); operation.setNumberB(numberB); System.out.println("結果是:"+operation.getResult()); } catch (Exception e) { System.out.println("輸入有誤,請重新開始。。。"); coal(); } } }
可是,我們為什麼要用它呢?我們可以直接在客戶端調用時直接new出對象,或者直接swith輸入的操作符字元再做運算不就好了?這就牽涉到開發中需求更改或後期維護了。如果在這一模塊開發完成後,突然需要一個開根號的運算需求,該如何做呢?如果沒有用簡單工廠,必將修改客戶端代碼。必須重新創建運算對象或更改對象。如果有成千上萬個客戶端呢?使用簡單的目的在於:
直接目的:避免在代碼中出現大量的new關鍵字根本目的:將對象的創建統一起來便於維護和整體把控
使用工廠後,在運算需求更改或添加時,我們只需更改工廠類即可完成。
當然,萬物有利有弊。工廠模式的弊端在於:
每次增加一個產品時,都需要增加一個具體類和對象實現工廠,使得系統中類的個數成倍增加,在一定程度上增加了系統的複雜度,同時也增加了系統具體類的依賴。簡單工廠這種沒有什麼技術上的難度,純粹是依照一些業務場景而出現的設計模式,甚至不屬於23種GOF設計模式之一,是不同工廠模式的一個特殊實現。