全網最簡單的Java設計模式【三】工廠方法模式詳解

Java工廠方法模式詳解

一、概念介紹

1. 什么是工廠方法模式?

工廠方法模式(Factory Method Pattern)是一種創建型設計模式,它允許定義一個接口或抽象類來創建對象,但將實際對象的實例化延遲到子類中實現。工廠方法模式通過定義一個用于創建對象的接口,讓子類決定實例化哪一個類,從而實現對象的創建與使用分離,提高系統的靈活性和可擴展性。

2. 角色組成

工廠方法模式主要由以下四個角色組成:

1)抽象工廠(Creator):聲明一個用于創建對象的工廠方法,該方法是一個抽象方法,由子類實現。

2)具體工廠(Concrete Creator):實現了抽象工廠接口,含有與應用相關的邏輯,用于創建具體的產品對象。

3)抽象產品(Product):定義了產品的接口,是工廠方法所創建對象的超類型,即工廠方法返回的對象類型。

4)具體產品(Concrete Product):實現了抽象產品接口的具體類,是被具體工廠創建的對象。

3. 特點

  • 延遲實例化:將對象的實例化延遲到子類中實現。
  • 符合開閉原則:新增產品時,只需新增相應的具體工廠類,無需修改原有代碼。
  • 降低耦合:客戶端只依賴于抽象工廠接口和產品接口,降低了客戶端與具體產品的耦合度。

二、使用場景與優缺點

1. 使用場景

工廠方法模式適用于以下場景:

  • 需要創建的對象類型在編譯時不確定:例如,根據不同的配置或輸入參數創建不同類型的對象。
  • 系統需要擴展,且不希望修改現有代碼:新增產品時,只需新增具體工廠類,無需修改現有代碼。
  • 創建對象的過程復雜,且需要隱藏具體創建邏輯:將對象的創建過程封裝在工廠類中,客戶端無需關心創建細節。

2. 優點

  • 良好的封裝性:隱藏了對象創建的細節,客戶端只需通過接口操作對象。
  • 優秀的可擴展性:新增產品時,只需新增具體工廠類,符合開閉原則。
  • 降低耦合度:客戶端只依賴于抽象接口,降低了與具體實現的耦合。

3. 缺點

  • 類的數量增加:針對每一種產品都需要定義一個具體工廠類,隨著產品種類的增加,類的數量也相應增加。
  • 產品族擴展困難:當需要新增產品族時,可能需要修改多個具體工廠類,影響系統的擴展性。

三、Java實現示例

以下是一個使用Java實現的工廠方法模式示例,模擬了一個簡單的汽車制造場景。

1. 抽象產品接口(Car)

下面是一個抽象產品接口,它定義了產品對象的公共接口。在這個例子中,Car接口有一個run方法,用于描述汽車運行的行為。


public interface Car {void run();
}

2. 具體產品實現類

BenzBMW是實現了Car接口的具體產品類。它們分別提供了run方法的具體實現,用于描述不同品牌汽車的運行行為。

public class Benz implements Car {@Overridepublic void run() {System.out.println("Benz is running.");  }}
public class BMW implements Car {@Overridepublic void run() {System.out.println("BMW is running.");}}

3. 抽象工廠接口(CarFactory)

下面是一個抽象工廠接口,它聲明了工廠方法createCar,該方法返回一個Car類型的對象。抽象工廠接口是工廠方法模式的核心,它允許系統在不直接指定具體產品類的情況下創建對象。

public interface CarFactory {Car createCar(); 
}

4. 具體工廠類

BenzFactoryBMWFactory 是實現了 CarFactory 接口的具體工廠類。它們分別重寫了 createCar 方法,用于創建并返回具體的產品對象(BenzBMW)。

public class BenzFactory implements CarFactory {@Overridepublic Car createCar() {return new Benz();}}
public class BMWFactory implements CarFactory {@Overridepublic Car createCar() {return new BMW();}}

5. 客戶端

客戶端通過工廠類來創建產品對象,而不是直接通過new關鍵字。這種方式使得客戶端代碼與具體產品類的實現解耦,提高了系統的靈活性和可擴展性。當需要添加新的產品類時,只需添加相應的具體產品類和具體工廠類,而無需修改客戶端代碼。

public class Client {public static void main(String[] args) {CarFactory benzFactory = new BenzFactory();  Car benz = benzFactory.createCar();  benz.run();  CarFactory bmwFactory = new BMWFactory();  Car bmw = bmwFactory.createCar();  bmw.run();  }}

運行結果:

Benz is running.
BMW is running.

結束語

工廠方法設計模式通過引入工廠等級結構,允許系統在不直接指定具體產品類的情況下創建對象。它通過將對象的創建過程封裝在工廠類中,使得客戶端代碼與具體產品類的實現解耦,提高了系統的靈活性和可擴展性。同時,它也遵循了開閉原則,即軟件實體應該對擴展開放,對修改關閉。但也存在類數量增加和產品族擴展困難等缺點。

在實際應用中,應根據具體需求選擇合適的設計模式,以提高代碼的可維護性和可擴展性。通過工廠方法模式,Java開發者可以更靈活地管理對象的創建過程,從而編寫出更加健壯和易于維護的代碼。

簡單動作,深刻聯結。在這技術海洋,我備好舟,等你揚帆。啟航吧!
🌟點擊【關注】,解鎖定期的技術驚喜,讓靈感與知識的源泉不斷涌動。
👍一個【點贊】,如同心照不宣的默契,是我們共同語言的閃亮印記。
📚【收藏】好文,搭建你的專屬智慧庫,讓每次回望都能照亮新知之路。
源碼地址:https://gitee.com/code-in-java/csdn-blog.git

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

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

相關文章

mybatis mapper.xml 比較運算符(大于|小于|等于)的寫法: 轉義和<![CDATA[]]>

文章目錄 引言I 使用xml 原生轉義的方式進行轉義II 使用 <![CDATA[ 內容 ]]>引言 應用場景:查詢時間范圍 背景:在 *.xml 中使用常規的 < > = <= >= 會與xml的語法存在沖突 <![CDATA[]]> 比 轉義符 來的繁瑣 <![CDATA[]]> 表示xml解析器忽略…

c++ 聯合(Union)的特性和使用

聯合&#xff08;Union&#xff09;是一種特殊的數據結構&#xff0c;允許在同一內存位置存儲不同的數據類型。一個 union 可以有多個數據成員&#xff0c;但是在任意時刻只有一個數據成員可以有值。當某個成員被賦值后其他成員變為未定義狀態。以下是聯合的主要特點和使用方式…

工程安全監測儀器振弦采集儀提升工程質量和安全水平

工程安全監測儀器振弦采集儀提升工程質量和安全水平 振弦采集儀是一種重要的工程安全監測儀器&#xff0c;可以用來監測建筑物、橋梁、隧道等工程結構的振動情況。它通過測量結構物的振動頻率和振幅&#xff0c;可以提供關鍵的數據用于評估結構的安全性和穩定性。振弦采集儀在…

無法解析的外部符號 _imp_XXX

問題解決&#xff1a;無法解析的外部符號 _imp_XXXXXXXXX-CSDN博客 解決方法 1. 打開網站&#xff0c;搜索相關函數&#xff0c;找到其關聯庫lib 2. 程序指定鏈接到庫。注意該語法是msvc編譯器特有特性。 #pragma comment(lib, "xxxx.lib")

【項目實踐】貪吃蛇

一、游戲效果展示二、博客目標三、使用到的知識四、Win32 API 介紹 4.1 WIn32 API4.2 控制臺程序4.3 控制屏幕上的坐標COORD4.4 GetStdHandle4.5 GetConsoleCursorInfo 4.5.1 CONSOLE_CURSOR_INFO 4.6 SetConsoleCursorInfo4.7 SetConsoleCursorPosition4.8 GetAsyncKeyState 五…

秋招突擊——7/4——復習{}——新作{最長公共子序列、編輯距離}

文章目錄 引言復習新作1143-最長公共子序列個人實現 參考實現編輯距離個人實現參考實現 貪心——買股票的最佳時機個人實現參考實現 貪心——55-跳躍游戲個人實現參考做法 總結 引言 昨天主要是面試&#xff0c;然后剩下的時間都是用來對面試中不會的東西進行查漏補缺&#xff…

dolphinscheduler-筆記2

springboot集成dolphinscheduler 說明 為了避免對DolphinScheduler產生過度依賴&#xff0c;實踐中通常不會全面采用其內置的所有任務節點類型。相反&#xff0c;會選擇性地利用DolphinScheduler的HTTP任務節點功能&#xff0c;以此作為工作流執行管理的橋梁&#xff0c;對接…

項目管理實用表格與應用【項目文件資料分享】

項目管理基礎知識 項目管理可分為五大過程組&#xff08;啟動、規劃、執行、監控、收尾&#xff09;十大知識領域&#xff0c;其中包含49個子過程 項目十大知識領域分為&#xff1a;項目整合管理、項目范圍管理、項目進度管理、項目成本管理、項目質量管理、項目資源管理、項目…

標量場與向量場

標量場與向量場 flyfish 場 是一個函數&#xff0c;它把空間中的每一點關聯到一個數值或一個數學對象&#xff08;如向量、張量等&#xff09;。在物理學中&#xff0c;場可以描述許多物理現象&#xff0c;例如溫度分布、電場、磁場、壓力場等。 標量場 標量場 是一個函數&…

【BUUCTF-PWN】9-ciscn_2019_n_8

不屬于棧溢出&#xff0c;應該是比較簡單的pwn&#xff0c;看懂代碼邏輯使用pwntools 32位&#xff0c;開啟了Stack、NX、PIE保護 執行效果&#xff1a; main函數 使用通義千問詢問的代碼解讀&#xff1a; 即當var數組的第十四個元素是17就可以 這里可以用兩種payload…

Python使用總結之應用程序有哪些配置方式?配置方式對比

Python使用總結之應用程序有哪些配置方式&#xff1f;配置方式對比 在Python程序中&#xff0c;管理配置信息的方法有很多&#xff0c;常見的方式包括使用INI文件、JSON文件、YAML文件、環境變量、以及直接在代碼中定義配置。每種方式都有其獨特的優勢和適用場景。 1. INI文件 …

天環公益原創開發進度網站源碼帶后臺免費分享

天環公益計劃首發原創開發進度網站源碼帶后臺免費分享 后臺地址是&#xff1a;admin.php 后臺沒有賬號密碼 這個沒有數據庫 有能力的可以自己改 天環公益原創開發進度網站 帶后臺

ARM架構服務器/虛擬機編譯部署Tendis(國產化替換Redis)

文章目錄 一、概述 二、安裝相關組件 三、下載最新的Tendis源碼 四、編譯源碼 五、啟動Tendis 六、使用Docker鏡像部署Tendis 七、常見報錯 八、參考鏈接 一、概述 國產化項目要求盡可能使用國產組件,尤其是已存在的項目,需要替換已有組件,比如使用Tendis替換Redis。…

微軟中國全面撤店!我們到現場看了看

ChatGPT狂飆160天&#xff0c;世界已經不是之前的樣子。 更多資源歡迎關注 7月1日&#xff0c;微軟官方發言人向媒體表示&#xff1a; “微軟不斷評估其零售策略以滿足我們的客戶不斷變化的需求&#xff0c;微軟已決定對中國大陸市場的渠道進行整合。客戶仍可通過零售合作伙伴…

校園失物招領系統帶萬字文檔java項目失物招領管理系統java課程設計java畢業設計springboot vue

文章目錄 校園失物招領系統一、項目演示二、項目介紹三、萬字字項目文檔四、部分功能截圖五、部分代碼展示六、底部獲取項目源碼帶萬字文檔&#xff08;9.9&#xffe5;帶走&#xff09; 校園失物招領系統 一、項目演示 校園失物招領系統 二、項目介紹 語言: Java 數據庫&…

JAVA導出數據庫字典到Excel

文章目錄 1、查詢某張表字段信息2、TableVo接收sql查詢得到的數據3、excel導出4、導出案例 1、查詢某張表字段信息 select column_name as columnName, -- 字段名 COLUMN_DEFAULT as colDefault, -- 默認值 column_key as columnKey, -- PRI-主鍵&#xff0c;UNI-唯一鍵&…

【Tools】 Postman 接口測試工具詳解

那年夏天我和你躲在 這一大片寧靜的海 直到后來我們都還在 對這個世界充滿期待 今年冬天你已經不在 我的心空出了一塊 很高興遇見你 讓我終究明白 回憶比真實精彩 &#x1f3b5; 王心凌《那年夏天寧靜的海》 在現代軟件開發中&#xff0c;API&#xff08;…

【Python實戰因果推斷】21_傾向分1

目錄 The Impact of Management Training Adjusting with Regression 之前學習了如何使用線性回歸調整混雜因素。此外&#xff0c;還向您介紹了通過正交化去偏差的概念&#xff0c;這是目前最有用的偏差調整技術之一。不過&#xff0c;您還需要學習另一種技術--傾向加權。這種…

Ionic 卡片:設計和使用指南

Ionic 卡片&#xff1a;設計和使用指南 Ionic 是一個強大的開源框架&#xff0c;用于構建跨平臺的移動應用程序。它結合了 Angular、React 和 Vue 的強大功能&#xff0c;允許開發者使用 Web 技術創建高性能的移動應用。Ionic 卡片是框架中的一個核心組件&#xff0c;用于展示…

js使用插件完成xml轉json

插件&#xff1a;xml2json.min.js 插件文件下載&#xff08;不能上傳附件&#xff09;&#xff1a;https://download.csdn.net/download/zhu_zhu_xia/89513965 html代碼&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset&qu…