簡單原廠模式:實質是一個工廠類根據傳入的參數,動態決定建立哪個產品類的執行個體,這些產品類繼承自一個類或介面;
解決問題:到底執行個體化誰,將來會不會增加執行個體化的對象;對於很容易變化的地方,應該考慮用一個單獨的類來做這個創造執行個體的過程。
執行個體:輸入兩個數和運算子,得到運算結果
1、建立抽象對象類Operation.java,具體對象類OperateAdd,java,OperateDivide.java,OperateMultiply.java,OperateSubtrct.java,工廠類OperateFactory.java,視圖類OperateMain.java
2、具體實現
OperateMain.java:
package com.test.factory;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.Scanner;import com.sun.corba.se.spi.orb.OperationFactory;public class OperateMain {private static int numberA;private static int numberB;private static InputStreamReader inputStreamReader;private static BufferedReader bufferReader;public static void main(String[] args){try {System.out.println("please input a number:");inputStreamReader = new InputStreamReader(System.in);bufferReader = new BufferedReader(inputStreamReader);numberA = Integer.parseInt(bufferReader.readLine());System.out.println("please input a operate:");Scanner input = new Scanner(System.in);String operate = input.next();System.out.println("please input a number again:");inputStreamReader = new InputStreamReader(System.in);bufferReader = new BufferedReader(inputStreamReader);numberB = Integer.parseInt(bufferReader.readLine());Operation oper = OperateFactory.createOperation(operate);oper.numberA = numberA;oper.numberB = numberB;System.out.println(numberA + operate + numberB + " = "+oper.getResult());} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
Operation.java:
package com.test.factory;public class Operation {public int numberA,numberB;public float result;public float getResult(){return result;}}
OperateAdd.java:
package com.test.factory;public class OperateAdd extends Operation{@Overridepublic float getResult() {// TODO Auto-generated method stubreturn numberA + numberB;}}
OperateFactory.java:
package com.test.factory;public class OperateFactory {public static Operation createOperation(String operate){if (operate.equals("+")){return new OperateAdd();} else if(operate.equals("-")) {return new OperateSubtract();} else if (operate.equals("*")){return new Operatemultiply();} else if (operate.equals("/")){return new OperateDivide();}return null;}}
3、Operation類中兩個int屬性,一個getResult方法行為;
加減乘除類都繼承Operation類,重寫getResult方法;
OperationFactory為工廠類,根據傳入的String參數,動態建立具體運算類,建立何種運算類,怎麼建立,都在這個類中實現;
4、運行如下:
優點
工廠類是整個模式的關鍵.包含了必要的邏輯判斷,根據外界給定的資訊,決定究竟應該建立哪個具體類的對象.通過使用工廠類,外界可以從直接建立具體產品對象的尷尬局面擺脫出來,僅僅需要負責“消費”對象就可以了。而不必管這些對象究竟如何建立及如何組織的.明確了各自的職責和權利,有利於整個軟體體繫結構的最佳化。
缺點
由於工廠類集中了所有執行個體的建立邏輯,違反了高內聚責任分配原則,將全部建立邏輯集中到了一個工廠類中;它所能建立的類只能是事先考慮到的,如果需要添加新的類,則就需要改變工廠類了。
當系統中的具體產品類不斷增多時候,可能會出現要求工廠類根據不同條件建立不同執行個體的需求.這種對條件的判斷和對具體產品類型的判斷交錯在一起,很難避免模組功能的蔓延,對系統的維護和擴充非常不利;
這些缺點在Factory 方法模式中得到了一定的克服。
使用情境
工廠類負責建立的對象比較少;
客戶只知道傳入工廠類的參數,對於如何建立對象(邏輯)不關心;
由於簡單工廠很容易違反高內聚責任分配原則,因此一般只在很簡單的情況下應用。