Java學習筆記——設計模式之五.工廠方法
阿新 • • 發佈:2017-05-14
strong scanner multipl 石頭 simple 決定 定義 opera 下使用
水邊
一只青蛙在笑
——石頭和水
工廠方法模式(Factory Method),定義了一個用於創建對象的接口,讓實現類決定實例化哪一個類。工廠方法使一個類的實例化延遲到其子類。
這裏在簡單和工廠的基礎上寫工廠:
先定義一個接口
1 package cn.no5.factorymethod; 2 3 import cn.no1.simplefactory.Operation; 4 5 public interface IFactory { 6 7 Operation CreateOperation(); 8 }
再定義其子類:
1 package cn.no5.factorymethod;2 3 import cn.no1.simplefactory.Operation; 4 import cn.no1.simplefactory.OperationAdd; 5 import cn.no1.simplefactory.OperationSub; 6 import cn.no1.simplefactory.OperationMultiply; 7 import cn.no1.simplefactory.OperationDivide; 8 9 public class AddFactory implements IFactory { 10 11 @Override12 public Operation CreateOperation() { 13 return new OperationAdd(); 14 } 15 16 } 17 public class SubFactory implements IFactory { 18 19 @Override 20 public Operation CreateOperation() { 21 return new OperationSub(); 22 } 23 24 } 25 public class MultiplyFactory implements IFactory {26 27 @Override 28 public Operation CreateOperation() { 29 return new OperationMultiply(); 30 } 31 32 } 33 public class DivideFactory implements IFactory { 34 35 @Override 36 public Operation CreateOperation() { 37 return new OperationDivide(); 38 } 39 40 }
測試類:
1 package cn.no5.factorymethod; 2 3 import java.util.Scanner; 4 5 import cn.no1.simplefactory.Operation; 6 7 public class _Test { 8 9 public static void main(String[] args) { 10 Scanner sc = new Scanner(System.in); 11 System.out.println("輸入數字1:"); 12 double numA = sc.nextDouble(); 13 System.out.println("輸入數字2:"); 14 double numB = sc.nextDouble(); 15 System.out.println("輸入操作符:"); 16 String operator = sc.next(); 17 sc.close(); 18 IFactory operFactory = null; 19 switch (operator) { 20 case "+": 21 operFactory = new AddFactory(); 22 break; 23 case "-": 24 operFactory = new SubFactory(); 25 break; 26 case "*": 27 operFactory = new MultiplyFactory(); 28 break; 29 case "/": 30 operFactory = new DivideFactory(); 31 break; 32 33 } 34 Operation oper = operFactory.CreateOperation(); 35 oper.setNumA(numA); 36 oper.setNumB(numB); 37 double result = oper.calculate(); 38 System.out.println("計算結果是:"+result); 39 } 40 }
現在應該可以發現簡單工廠和工廠方法的區別了:
工廠方法比簡單工廠麻煩多了?這種感性的回答可不能算數,得從流程上分析它們的區別。
簡單工廠:客戶端無需判斷創建哪個實例對象,但是需要把符號數據傳入簡單工廠,簡單工廠根據傳入的符號返回實例對象。
工廠方法:客戶端需要根據符號判斷創建哪個工廠對象,所以無需再傳入什麽符號,工廠對象直接調用方法返回實例對象。
考慮這麽個場景,需要創建10個加法實例:
如果你使用簡單工廠,你需要傳10次符號(比如10次“+”)給簡單工廠,既然知道都是加法,幹嘛還要重復傳10次”+“?!不好意思,客戶端不考慮這些,他只負責給工廠傳參數就能得到實例;
如果你使用工廠方法,直接創建加法工廠,調用其生產方法10次即可。
這下簡單工廠的使用範圍也就清楚了。就是在比較簡單的情況下使用簡單工廠。比如計算器。客戶端只操作一次,得到一個運算實例,但誰也不知道用戶要輸入什麽操作符號,索性把符號丟給簡單工廠。
Java學習筆記——設計模式之五.工廠方法