設計模式-創建型模式-工廠方法模式

一、什么是工廠方法模式

????????工廠模式又稱工廠方法模式,是一種創建型設計模式,其在父類中提供一個創建對象的方法, 允許子類決定實例化對象的類型。工廠方法模式是目標是定義一個創建產品對象的工廠接口,將實際創建工作推遲到子類中。這種設計模式也是 Java 開發中最常見的一種模式,它的主要意圖是定義一個創建對象的接口,讓其子類自己決定實例化哪一個工廠類,工廠模式使其創建過程延遲到子類進行。

二、場景模擬

? ? ? ? 假設我們要給一個成本計算系統設計一套各種材料的成本計算。其中材料有鋼板、油漆、運輸等成本,每個成本需要計算單條記錄成本,本周成本和月度成本。

三、業務實現

? ? ? ? 首先我們定義一下成本接口?ICosts,里面有三個方法,分別是SingleCosts(),WeekCosts()和

MonthCosts()。

3.1、定義成本接口

成本接口?ICosts,模擬三個方法,計算單個成本、本月成本和本周成本;

public interface ICosts {/*** 單成本計算*/void SingleCosts();/*** 周成本計算*/void WeekCosts();/*** 月成本計算*/void MonthCosts();
}

3.2、定義具體實現類?

首先是鋼板類材料實現類

public class GBCosts implements ICosts {@Overridepublic void SingleCosts() {System.out.println("計算鋼板成本");}@Overridepublic void WeekCosts() {System.out.println("計算本周鋼板成本");}@Overridepublic void MonthCosts() {System.out.println("計算本月鋼板成本");}
}

然后是油漆

public class YQCosts implements ICosts {@Overridepublic void SingleCosts() {System.out.println("計算油漆成本");}@Overridepublic void WeekCosts() {System.out.println("計算本周油漆成本");}@Overridepublic void MonthCosts() {System.out.println("計算本月油漆成本");}
}

最后是運輸

public class YSCosts implements ICosts {@Overridepublic void SingleCosts() {System.out.println("計算運輸成本");}@Overridepublic void WeekCosts() {System.out.println("計算本周運輸成本");}@Overridepublic void MonthCosts() {System.out.println("計算本月運輸成本");}
}

3.3、定義成本計算工廠

public class CostsFactory {public ICosts getCostsService(String name) {switch (name) {case "GB":return new GBCosts();case "YQ":return new YQCosts();case "YS":return new YSCosts();default:throw new RuntimeException("不錯在此成本計算服務");}}
}

3.4、測試

public static void main(String[] args) {CostsFactory costsFactory = new CostsFactory();ICosts GBCosts = costsFactory.getCostsService("GB");GBCosts.SingleCosts();GBCosts.WeekCosts();GBCosts.MonthCosts();ICosts YQCosts = costsFactory.getCostsService("YQ");YQCosts.SingleCosts();YQCosts.WeekCosts();YQCosts.MonthCosts();}

可以看到既滿足了業務的需求,也滿足了自己對代碼的追求。這樣的代碼不必有大量的if-else存在,而且擴展性更強,代碼結構更加清晰。

四、總結

????????工廠方法模式(Factory Method Pattern)是一種創建型設計模式,用于創建對象的過程被推遲到子類中進行,這樣可以使一個類的實例化延遲到其子類。這種模式通過定義一個創建對象的接口,但是由子類決定要實例化的類是哪一個。

? ? ? ? 當使用時只需要調用抽象工廠接口來創建即可,不需要了解具體的實現和創建邏輯。例如在數據庫操作中,針對不同的數據庫類型(Mysql、Oracle等)可以使用不同的數據庫連接對象,工廠方法可以根據需要創建不同類型的連接對象。

????????通過工廠方法,我們可以在客戶端代碼中對產品的具體類型進行抽象,并通過子類來創建相應的對象,從而提供了更大的靈活性和可擴展性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/161770.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/161770.shtml
英文地址,請注明出處:http://en.pswp.cn/news/161770.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

解讀可解釋性機器學習:理解解釋性基準模型(EBM)

解讀可解釋性機器學習:理解解釋性基準模型(EBM) 近年來,隨著機器學習模型的復雜性不斷增加,研究人員和從業者對模型的可解釋性提出了更高的要求。可解釋性機器學習(Explainable Machine Learning, XAI&…

SHAP - 機器學習模型可解釋性工具

github地址:shap/docs/index.rst at master shap/shap (github.com) SHAP使用文檔:歡迎使用 SHAP 文檔 — SHAP 最新文檔 SHAP介紹 SHAP(SHapley Additive exPlanations)是一種用于解釋預測結果的方法,它基于Shapley…

實現el-input-number數字框帶單位

實現的效果展示&#xff0c;可以是前綴單位&#xff0c;也可以是后綴單位。實現的思路就是動態修改偽元素 ::before 和 ::after 的 content值 實現二次封裝數字框的代碼如下&#xff1a; <template><el-input-numberref"inputNumber"v-model"inputVal…

opencv-直方圖

直方圖是一種對圖像亮度分布的統計表示&#xff0c;它顯示了圖像中每個灰度級別的像素數量。在OpenCV中&#xff0c;你可以使用cv2.calcHist() 函數計算直方圖。 以下是一個簡單的示例&#xff0c;演示如何計算和繪制圖像的直方圖&#xff1a; import cv2 import numpy as np …

【C++容器】優先級隊列 仿函數 反向迭代器

優先級隊列&#xff0c;仿函數&#xff0c;反向迭代器 優先級隊列認識優先級隊列模擬實現優先級隊列 淺談仿函數仿函數的大致了解仿函數的實現 反向迭代器什么是反向迭代器&#xff1f;反向迭代器的實現 結語 優先級隊列 認識優先級隊列 優先級隊列&#xff08;priority_queue…

Doris分區與分桶(八)

接上篇----------Doris 建表示例 Doris 支持兩層的數據劃分。第一層是 Partition&#xff0c;支持 Range 和 List 的劃分方式。第二層是 Bucket&#xff08;Tablet&#xff09;&#xff0c;僅支持 Hash 的劃分方式。 也可以僅使用一層分區。使用一層分區時&#xff0c;只支持…

低成本打造便攜式無線網絡攻防學習環境

1.摘要 一直以來, 無線網絡安全問題與大眾的個人隱私息息相關, 例如: 為了節省流量, 連接到一個看似安全的免費WiFi, 在使用過程中泄露自己的各類密碼信息甚至銀行卡賬號密碼信息。隨著家用智能電器的普及, 家中的各類智能設備連入家里的無線網絡, 卻突然失靈, 甚至無法正常連…

模擬Spring源碼思想,手寫源碼,理解注解

1、BeanDefinition package com.csdn.myspring; import lombok.AllArgsConstructor; import lombok.Data; Data AllArgsConstructor public class BeanDefinition {private String beanName;private Class beanClass; }2、掃描包的工具類MyTools package com.csdn.myspring; im…

@Scheduled注解 定時任務講解

用于在Java Spring框架中定時執行特定任務的注解 Scheduled&#xff0c;它能夠指定方法在特定時間間隔或特定時間點執行。默認參數是cron&#xff0c;cron參數被用來定義一個Cron表達式&#xff0c;它代表了任務執行的時間規則 參數如下 Cron 這是是一種時間表達式&#xff…

【應用程序啟動過程-三種加載控制器的方式-上午內容復習 Objective-C語言】

一、我們先來回憶一下,上午所有內容 1.首先呢,我們先說的是這個“應用程序啟動過程”, 應用程序啟動過程里面,有三方面內容 1)UIApplication對象介紹 2)AppDelegate對象介紹 3)應用程序啟動過程 現在不知道大家對這個應用程序啟動過程有印象嗎, 2.首先,這個UIAp…

MySQL數據庫時間計算的用法

今天給大家分享如何通過MySQL內置函數實現時間的轉換和計算&#xff0c;在工作當中&#xff0c;測試人員經常需要查詢數據庫表的日期時間&#xff0c;但發現開發人員存入數據庫表的形式都是時間戳形式&#xff0c;不利于測試人員查看&#xff0c;測試人員只能利用工具對時間戳進…

【 順序表經典算法—移除元素和合并兩個有序數組】

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 目錄 前言 經典算法OJ題1&#xff1a; 移除元素 解法一、逐個判斷 解法二、雙指針覆蓋 經典算法OJ題2&#xff1a; 合并兩個有序數組 OJ題分為兩個類型&#xff1a; 總結 前言…

MAX/MSP SDK學習07:list傳遞

實現自定義Obejct&#xff0c;要求將傳入的一組數據100后傳出。 #include "ext.h" #include "ext_obex.h" typedef struct _listTrans {t_object ob;void* outLet;t_atom* fArr;long listNum;} t_listTrans;void* listTrans_new(t_symbol* s, long arg…

14.Python 模塊

目錄 1. 使用模塊2. 使用包3. 常用模塊3.1 日期和時間3.2 偽隨機數3.3 摘要算法3.4 JSON 處理3.5 圖像處理 模塊是Python用來組織代碼的一種方法&#xff0c;包是Python用來組織模塊的一種方法。 1. 使用模塊 Python 把能夠相互包含&#xff0c;且有組織的代碼段稱為模塊&…

.NET面試題1

1.什么是C#&#xff1f; C#&#xff08;讀作"C sharp"&#xff09;是一種通用的、面向對象的編程語言&#xff0c;由Microsoft開發。它是一種靜態類型語言&#xff0c;支持強類型檢查和面向對象編程&#xff08;OOP&#xff09;的概念。C#主要用于開發Windows應用程序…

Bug等級劃分

Bug是指在程序或系統中存在的錯誤、缺陷或異常&#xff0c;是由于編碼錯誤、設計問題、邏輯錯誤或其他因素導致的。 常見的Bug分類方法 功能性Bug與軟件的功能有關&#xff0c;軟件無法正常工作、功能與需求不符或功能執行不正確。 用戶界面Bug與軟件的用戶界面有關&#xff…

Unity中Shader雙向反射分布函數BRDF

文章目錄 前言一、渲染方程二、什么是BxDF1、BSSRDF2、BRDF3、BTDF4、BSDF 三、迪士尼原則的BRDF四、迪士尼原則的BRDF的參數五、在Unity中看一下默認Shader的這些參數六、在這里記錄一下使用 Blender 和 SubstancePainter 的流程1、在Blender中導出模型為 .obj 格式2、在Subst…

Android WMS—— Surace管理 (二十)

WMS 負責創建 Surface 以及對 Surface 的擺放工作,之后將 Surface 提交給SurfaceFlinger 進行合并。在 App 層也創建了一個 Surface 對象,但是那個是空對象,用于 WMS 的填充。 一、Surface的創建 首先 APP 層在 ViewRootImpl 的 relayoutWindow() 方法中發起創建任務。 1、…

Go 實現網絡代理

使用 Go 語言開發網絡代理服務可以通過以下步驟完成。這里&#xff0c;我們將使用 golang.org/x/net/proxy 包來創建一個簡單的 SOCKS5 代理服務作為示例。 步驟 1. 安裝 golang.org/x/net/proxy 包 使用以下命令安裝 golang.org/x/net 包&#xff0c;該包包含 proxy 子包&am…

天軟特色因子看板 (2023.11 第12期)

該因子看板跟蹤天軟特色因子A05006(近一月單筆流入流出金額之比(%)&#xff0c;該因子為近一個月單筆流入流出金額之比(%)均值因子&#xff0c;用以刻畫在 市場日內分時成交中流入、流出成交金額的差異性特點&#xff0c;發掘市場主力資金的作用機制。 今日為該因子跟蹤第12期&…