設計模式-工廠方法模式學習筆記

来源:https://www.cnblogs.com/fonxi/archive/2019/05/16/10873350.html
-Advertisement-
Play Games

工廠方法模式 定義 工廠方法(Factory Method)模式的意義是定義一個創建產品對象的工廠介面,將實際創建工作推遲到子類當中。核心工廠類不再負責產品的創建,這樣核心類成為一個抽象工廠角色,僅負責具體工廠子類必須實現的介面,這樣進一步抽象化的好處是使得工廠方法模式可以使系統在不修改具體工廠角色 ...


工廠方法模式

  • 定義

工廠方法(Factory Method)模式的意義是定義一個創建產品對象的工廠介面,將實際創建工作推遲到子類當中。核心工廠類不再負責產品的創建,這樣核心類成為一個抽象工廠角色,僅負責具體工廠子類必須實現的介面,這樣進一步抽象化的好處是使得工廠方法模式可以使系統在不修改具體工廠角色的情況下引進新的產品。


 

  • 優缺點

優點:

  1. 相比簡單工廠方法模式,工廠方法模式對修改不在開放,滿足了開閉原則(工廠類抽象成了父類,判斷創建對象的代碼放到了客戶端)

缺點:

  1. 一種對象對應一個工廠,類的數量增加了,程式變得複雜

 

  • 特點
  1. 抽象出一個工廠父類
  2. 工廠子類new出具體產品對象,並返回
  3. 新增具體產品對象時,對應新增工廠子類

 

  • 結構

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種設計模式的一種,屬於創建型模式,它保持了簡單工廠模式的優點,又剋服了簡單工廠模式的缺點,但是在一定程度上增加了程式的複雜度。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 第一個知識點:表單的屬性及總結 第二個知識點:H5新增的表單控制項和屬性以及總結 第一個知識點: 我們常見的表單驗證有哪些呢 text 文本框標簽 password 密碼框 checkbox 多選框 radio 單選框 button 按鈕 submit 提交按鈕 以上是我們常用的一些form屬性 第二 ...
  • 我用的簡單的直接的字元串格式轉化 ...
  • Json用途 轉自:https://www.cnblogs.com/daikefeng/p/6366229.html JSON定義 JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式,易於閱讀和編寫,同時也易於機器解析和生成。它基於ECMA262語言規範(1 ...
  • react框架下,在頁面內載入顯示PDF文件,關於react-pdf-js的使用註意事項 之前做了一個需求,在註冊賬號的時候,讓用戶同意服務條款, 服務條款是一個PDF文件, 這就需要在react內載入PDF文件的插件了,今天特地做一個總結 我用的版本是4.0.1 然後在頁面內引入 import P ...
  • 前段時間遇到的一個需求,要求滑鼠懸停顯示使用描述, 用到了react-tooltip插件,今天寫一個總結 先看效果(為了方便參考,用的是原始樣式): 文檔參考地址: https://www.npmjs.com/package/react-tooltip 1, 首先在配置文件加上引用 2, 然後在頁面 ...
  • 摘要: 你所不知道的系列。 原文: "提高 JavaScript 開發效率的高級 VSCode 擴展之二!" 作者: "前端小智" "Fundebug" 經授權轉載,版權歸原作者所有。 作為一名業餘愛好者、專業人員,甚至是每月只有一次編程的開發人員,你必須知道,對於任何願意在工作中投入最大生產時間的 ...
  • 道路千萬條,安全第一條! 魔方結構解析 從魔方的外觀來看,可以有多種方式來表達它的組成,從而也有多種方式來形成一個魔方。如: 由六個面組成 由若幹層組成 由多個方塊組成 無論哪種方式,都可以製作魔方。只是,不同的方式對後續的其它操作會有影響,有些方式甚至會導致利用已有的特性無法直接表達。因此,在這項 ...
  • 1.代碼: ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...