工廠方法模式 定義 工廠方法(Factory Method)模式的意義是定義一個創建產品對象的工廠介面,將實際創建工作推遲到子類當中。核心工廠類不再負責產品的創建,這樣核心類成為一個抽象工廠角色,僅負責具體工廠子類必須實現的介面,這樣進一步抽象化的好處是使得工廠方法模式可以使系統在不修改具體工廠角色 ...
工廠方法模式
- 定義
工廠方法(Factory Method)模式的意義是定義一個創建產品對象的工廠介面,將實際創建工作推遲到子類當中。核心工廠類不再負責產品的創建,這樣核心類成為一個抽象工廠角色,僅負責具體工廠子類必須實現的介面,這樣進一步抽象化的好處是使得工廠方法模式可以使系統在不修改具體工廠角色的情況下引進新的產品。
- 優缺點
優點:
- 相比簡單工廠方法模式,工廠方法模式對修改不在開放,滿足了開閉原則(工廠類抽象成了父類,判斷創建對象的代碼放到了客戶端)
缺點:
- 一種對象對應一個工廠,類的數量增加了,程式變得複雜
- 特點
- 抽象出一個工廠父類
- 工廠子類new出具體產品對象,並返回
- 新增具體產品對象時,對應新增工廠子類
- 結構
Creator:工廠父類,返回一個產品父類的對象
ConcreteCreator:工廠子類,返回一個具體產品類的對象
Product:產品父類,工廠創建對象的父類
ConcreteProduct:具體的產品類,被工廠創建的類
- 代碼
例子:計算器
類圖:
工廠父類
/** * @ Author :fonxi * @ Date :2019/5/15 0:59 * @ Description:工廠父類 */ public interface Creator { Operation createOperation(); }
工廠子類
/** * @ Author :fonxi * @ Date :2019/5/15 1:00 * @ Description:加法工廠 */ public class AddFactory implements Creator{ @Override public Operation createOperation() { System.out.println("加法運算"); return new Add(); } }
/** * @ Author :fonxi * @ Date :2019/5/15 1:06 * @ Description:除法工廠 */ public class DivideFactory implements Creator{ @Override public Operation createOperation() { System.out.println("除法運算"); return new Divide(); } }
/** * @ Author :fonxi * @ Date :2019/5/15 1:08 * @ Description:乘法工廠 */ public class MultiplyFactory implements Creator { @Override public Operation createOperation() { System.out.println("乘法運算"); return new Multiply(); } }
/** * @ Author :fonxi * @ Date :2019/5/15 1:09 * @ Description:減法工廠 */ public class SubtractFactory implements Creator{ @Override public Operation createOperation() { System.out.println("減法運算"); return new Subtract(); } }
產品對象父類(演算法父類)
/** * @ Author :fonxi * @ Date :2019/5/15 1:02 * @ Description:演算法父類 */ public interface Operation { Double getResult(Double num1,Double num2); }
具體產品對象類(演算法子類)
/** * @ Author :fonxi * @ Date :2019/5/15 1:01 * @ Description:加法演算法 */ public class Add implements Operation{ @Override public Double getResult(Double num1, Double num2) { return num1 + num2; } }
public class Divide implements Operation{ @Override public Double getResult(Double num1, Double num2) { return num1 / num2; } }
public class Multiply implements Operation{ @Override public Double getResult(Double num1, Double num2) { return num1 * num2; } }
public class Subtract implements Operation{ @Override public Double getResult(Double num1, Double num2) { return num1 - num2; } }
客戶端調用類
/** * @ Author :fonxi * @ Date :2019/5/15 0:50 * @ Description:客戶端調用類 */ public class TestController { public void print(){ try { Scanner s = new Scanner(System.in) ; System.out.println("請輸入第一個數字"); Double num1 = s.nextDouble(); System.out.println("請輸入第二個數字"); Double num2 = s.nextDouble(); System.out.println("請輸入運算"); String operator = s.next(); Operation operation ; Creator creator = null; try{ switch (operator){ case "+": creator = new AddFactory(); break; case "-": creator = new SubtractFactory(); break; case "*": creator = new MultiplyFactory(); break; case "/": creator = new DivideFactory(); break; default: System.out.println("輸入運算符有誤"); break; } }catch (Exception e){ System.out.println("輸入有誤"+e.getMessage()); } operation = creator.createOperation(); System.out.println("運算結果:"+operation.getResult(num1,num2)); }catch (Exception e){ System.out.println("輸入有誤"+e.getMessage()); } } }
運算結果
請輸入第一個數字 80 請輸入第二個數字 3 請輸入運算 / 除法運算 運算結果:26.666666666666668
- 總結
工廠方法模式又稱工廠模式,23種設計模式的一種,屬於創建型模式,它保持了簡單工廠模式的優點,又剋服了簡單工廠模式的缺點,但是在一定程度上增加了程式的複雜度。