1. 程式人生 > >Java學習筆記——設計模式之五.工廠方法

Java學習筆記——設計模式之五.工廠方法

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 @Override
12 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學習筆記——設計模式之五.工廠方法