技術成神之路:設計模式(四)工廠方法模式

1.定義


工廠方法模式(Factory Method Pattern)是一種創建型設計模式,它提供了一種創建對象的接口,而不是通過具體類來實例化對象。工廠方法模式的主要作用是讓子類決定實例化哪一個類,從而實現對象創建的延遲到具體子類中進行。

2.主要作用


作用就是使設計更加靈活和可擴展。通過這種方式,父類無需知道具體要創建的對象是哪一種,這樣就提高了系統的可擴展性和可維護性(符合開閉原則)一切優秀的模式都向設計原則看齊。

3.解決的問題

說到解決的問題,這里就不得不提下簡單工廠模式了,什么?你不知道簡單工廠模式是什么,沒關系,先來看下定義:

簡單工廠模式是一種創建型模式,它定義了一個工廠類,該類包含一個方法,根據給定的參數來返回不同類的實例。
客戶端通過向工廠類傳遞參數來獲取所需的具體對象實例,而不需要直接實例化對象。

包含角色:

  1. 工廠類(Factory):負責根據客戶端的請求創建相應的對象。

  2. 產品類(Product):被創建的對象的基類或接口。具體的產品類是工廠類所創建的對象類型。

  3. 具體產品類(Concrete Product):實現了產品接口的具體對象類,由工廠類根據客戶端的需求創建和返回。

UML類圖:
在這里插入圖片描述
代碼示例:

public class LoggerFactory {public static Logger createLogger(String logType) {if ("Console".equals(logType)) {return new ConsoleLogger();} else if ("File".equals(logType)) {return new FileLogger();} else if ("Remote".equals(logType)) {return new RemoteLogger();} else {throw new IllegalArgumentException("Unsupported log type");}}
}

通過 LoggerFactory.createLogger("Console")LoggerFactory.createLogger("File") 或者 LoggerFactory.createLogger("Remote") 來獲取不同類型的日志記錄器,這種方式就是簡單工廠模式,熟不熟悉,在你的項目中是不是也使用過這種模式呢,由于不難理解所以稱為簡單

簡單是簡單,當然他也有一些弊端,如果上面示例代碼中 Logger 抽象類中只有打印一個方法,后續需要新增保存日志,過濾日志… 問題就暴露出來了,簡單來說就是 簡單工廠模式違反了開閉原則,即對擴展開放,對修改關閉

工廠方法模式解決了簡單工廠模式的哪些問題?

  • 開閉原則:工廠方法模式遵循開閉原則,通過定義抽象工廠類和具體工廠類的繼承關系,新增產品時只需增加具體工廠類和產品類,而無需修改現有代碼,降低了系統的耦合性。
  • 擴展性:工廠方法模式支持更多的靈活性,每個具體的工廠類只負責創建對應的產品,符合單一職責原則,代碼更加清晰和可維護。
  • 維護性:由于工廠方法模式將對象的創建延遲到子類中,避免了簡單工廠模式中工廠類集中所有產品創建邏輯的問題,使代碼結構更加清晰和可擴展。

簡單來說,就是解決了簡單工廠模式中集中創建邏輯和不符合開閉原則的問題,提高了代碼的靈活性和可維護性。

4.模式原理

包含角色:

  1. 產品(Product):定義產品的接口。
  2. 具體產品(ConcreteProduct):實現產品接口的具體類。
  3. 工廠(Factory):定義創建產品對象的接口。
  4. 具體工廠(ConcreteFactory):實現創建產品對象的具體類。

UML類圖:
在這里插入圖片描述

// 定義產品接口
public interface Product {String operation();
}// 定義具體產品類
public class ConcreteProductA implements Product {@Overridepublic String operation() {return "產品A";}
}public class ConcreteProductB implements Product {@Overridepublic String operation() {return "產品B";}
}// 定義工廠接口
public abstract class Creator {// 工廠方法public abstract Product factoryMethod();// 其它操作方法public String someOperation() {Product product = factoryMethod();return product.operation();}
}// 定義具體工廠類
public class ConcreteCreatorA extends Creator {@Overridepublic Product factoryMethod() {return new ConcreteProductA();}
}public class ConcreteCreatorB extends Creator {@Overridepublic Product factoryMethod() {return new ConcreteProductB();}
}// 客戶端代碼
public class Client {public static void main(String[] args) {clientCode(new ConcreteCreatorA());clientCode(new ConcreteCreatorB());}public static void clientCode(Creator creator) {System.out.println("Client: " + creator.someOperation());}
}

打印:

Client: 產品A
Client: 產品B

相較簡單工廠模式 增加了一個具體工廠角色,每增加一個具體產品,需要同時增加一個具體工廠類。所以說各有優缺點吧。

4.優缺點


優點:

  • 遵循開閉原則:可以在引入新產品時不修改現有代碼。
  • 遵循單一職責原則:將產品對象的創建邏輯封裝在工廠類中。
  • 減少代碼耦合:客戶端不直接依賴于具體類,只依賴于抽象產品和工廠接口(符合依賴倒置原則)。.

缺點:

  • 增加代碼復雜性:每增加一個具體產品,需要同時增加一個具體工廠類。
  • 類的數量增加:每個具體產品都需要一個對應的具體工廠,會導致類的數量增加。

5.應用場景


  1. 需要創建復雜對象:當對象的創建過程比較復雜,且需要多步操作時。
  2. 產品種類多且類型不確定:當系統中需要創建的產品種類較多且類型在運行時才確定時。
  3. 需要對創建過程進行控制:當需要對對象的創建過程進行控制,并且希望將控制邏輯封裝起來時。

emm… 其實還是簡單工廠模式 應用場景更廣泛些,畢竟簡單好用🤭

總結比較:

  • 簡單工廠模式適合于對象類型較少且不經常變化的場景,代碼較為簡單,但不符合開閉原則,難以擴展新的產品類型。
  • 工廠方法模式更加符合開閉原則,通過增加新的具體工廠和具體產品類來擴展系統功能,但會增加系統中類的個數和復雜度。

6.總結


工廠模式解決了簡單工廠模式中集中創建邏輯和不符合開閉原則的問題,但同時自身也有一些弊端,但通過合理應用工廠方法模式,在特定的場景可以有效地提高系統的可維護性和擴展性。

設計模式沒有最好的,只有最適合的,大家在選用時,要權衡利弊,避免過度設計!

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

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

相關文章

2024年6月國產數據庫大事記-墨天輪

本文為墨天輪社區整理的2024年6月國產數據庫大事件和重要產品發布消息。 目錄 2024年6月國產數據庫大事記 TOP102024年6月國產數據庫大事記(時間線)產品/版本發布兼容認證代表廠商大事記廠商活動相關資料 2024年6月國產數據庫大事記 TOP10 2024年6月國…

最優雅的PHP框架 Laravel

Laravel 之所以被稱為最優雅的 PHP 框架,是因為它在設計和功能上做了很多獨特的創新,極大地提高了開發效率和代碼的可維護性。以下是 Laravel 受歡迎的主要原因: 良好的文檔和社區支持 Laravel 有詳盡的官方文檔,涵蓋了框架的所有功能和用法。此外,Laravel 社區非常活躍…

【Python】已解決:SyntaxError invalid syntax

文章目錄 一、分析問題背景二、可能出錯的原因三、錯誤代碼示例四、正確代碼示例五、注意事項 已解決:SyntaxError invalid syntax 一、分析問題背景 在Python編程中,SyntaxError: invalid syntax是一個常見的錯誤,它通常表示代碼中存在語法…

.net開發:NPOI生成excel文件到磁盤

源碼實測可用 使用.net工具包NPOI,生成excel文件到本地磁盤。 實際項目中可以指定路徑到服務器,把生成的文件存放到服務器指定目錄。 controller層 [HttpPost("ExportExcel")]public void ExportExcel(){_TestService.ExportToExcel();} serv…

redis中的事務和mysql中的事務有什么區別?

Redis和MySQL的事務在概念和特性上存在一些顯著的區別: 1. 原子性(Atomicity): - MySQL:事務具有原子性,即事務中的所有操作要么全部成功,要么全部失敗,如果中途出現錯誤,整個事…

Linux內核 -- 虛擬化之virtqueue結構

Linux Kernel中的Virtqueue Virtqueue是Linux Kernel中用于實現Virtio設備的一個關鍵數據結構。Virtio是一種虛擬I/O設備標準,旨在簡化虛擬化環境中虛擬設備與虛擬機之間的通信。Virtqueue則是實現這種通信的核心機制。以下是Virtqueue的一些關鍵點: V…

主流I/O模型總結(Linux Windows)

I/O復用模型(EPOLL) 模型思想:向內核注冊需要監聽的文件描述符,操作系統負責保存監視對象文件描述符,當有事件發生時,epoll_wait僅返回有事件發生的文件描述符數組 優點: 1.無需編寫以監視狀態為目的的針對所有文件描述符的循環語…

案例|水上水下一體化測量,為九寨溝精準把脈

? 九寨溝,被譽為“人間仙境”,其湖群以獨特的地理位置和優美的自然景觀吸引著世界各地的游客,更是九寨溝生態系統中不可或缺的重要組成部分。因此,精準地掌握湖群的地形數據、水體分布及變化情況,能夠揭示水下生態系…

【數據結構與算法基礎】算法復雜度

歡迎光顧我的homepage 前言 算法就是定義良好的計算過程,它取一個活一組的值輸入,并產生出一個或一組值作為輸出。簡單來說,算法就是一系列的計算步驟,用來將輸入數據轉化成輸出結果。 一、算法效率 如何去衡量一個算法的好壞&am…

[C++]——同步異步日志系統(3)

同步異步日志系統 一、日志系統框架設計1.1模塊劃分1.1.1 日志等級模塊1.1.2 日志消息模塊1.1.3 日志消息格式化模塊1.1.4 日志落地模塊(日志落地的方向是工廠模式)1.1.5 日志器模塊(日志器的生成是建造者模式)1.1.6 異步線程模塊…

Android12上實現雙以太網卡共存同時訪問外網

具體實現如下: 修改main 表優先級到9999, 作用:eth0 eth1 訪問 不去teardown 低分數網線 diff --git a/service/src/com/android/server/ConnectivityService.java b/service/src/com/android/server/ConnectivityService.java index 418e…

Ubuntu 22.04 設置swap交換空間

經常爆內存,導致很多應用沒有辦法一直正常運行,可以通過設置swap來緩解一下,雖然和內存的速度無法媲美,但是能一定程度緩解一下問題。 一、查看當前分區 查看當前系統的swap大小 free -m 二、關閉現有的swap分區 將/etc/fstab…

CUDA Kernel調試與優化--背景知識掃盲(LLM生成)

CUDA Kernel調試與優化–背景知識掃盲(LLM生成) 對于使用CUDA進行調試與性能優化,官方提供了豐富的參考資料和工具。以下是一些關鍵資源,可以幫助你更好地調試和優化CUDA代碼: 官方文檔和指南 CUDA Toolkit Documentation URL: CUDA Toolk…

強化學習總結(有具體代碼實現)

文章目錄 第一部分 強化學習基礎第1章 強化學習概述1.1 強化學習概念1.2 強化學習的環境1.3 強化學習的目標1.4 強化學習的數據 第2章 多臂老虎機問題(MAB問題)2.1 問題描述2.1.1 問題定義2.1.2 形式化描述2.1.3 累積懊悔2.1.4 估計期望獎勵 2.2 解決方法…

CSS 【詳解】CSS 函數(含 calc,min,max,clamp,cubic-bezier,env,steps 等)

函數描述CSS 版本attr()返回選擇元素的屬性值。2calc()允許計算 CSS 的屬性值,比如動態計算長度值。3cubic-bezier()定義了一個貝塞爾曲線(Cubic Bezier)。3hsl()使用色相、飽和度、亮度來定義顏色。3hsla()使用色相、飽和度、亮度、透明度來定義顏色。3linear-grad…

Bert 變種, T5模型

NLP-預訓練模型-2019-NLU:DistilBERT【 BERT模型壓縮】【模型大小減小了40%(66M),推斷速度提升了60%,但性能只降低了約3%】_distillbert-CSDN博客 https://zhuanlan.zhihu.com/p/673535548 大語言模型系列-T5_t5模型…

【機器學習】必會數學知識:一文掌握數據科學核心數學知識點(上),值得收藏~

核心數學知識點 1、引言2、數據科學必會數學知識2.1 線性代數2.2 微積分2.3 概率論2.4 數理統計2.5 隨機過程2.6 數據分布2.7 貝葉斯統計2.8 線性回歸2.9 邏輯回歸2.10 矩陣分解2.11 主成分分析(PCA)2.12 奇異值分解(SVD) 3、總結…

【Git 入門】初始化配置與新建倉庫

文章目錄 前言配置git新建倉庫倉庫的概念創建倉庫命令總結前言 在現代軟件開發中,版本控制系統已經成為了不可或缺的工具。其中,Git 是最為廣泛使用的版本控制系統之一。Git 不僅可以幫助我們管理和跟蹤代碼的變化,還可以方便地與他人協作。本文將介紹 Git 的基礎知識,包括…

【人工智能大語言模型技術發展研究報告 2024】

文末?有福利! 人工智能作為引領新一輪科技產業革命的戰略性技術和新質生產力重要驅動力,正在引發經濟、社會、文化等領域的變革和重塑,2023 年以來,以 ChatGPT、GPT-4 為代表的大模型技術的出臺,因其強大的內容生成及…

提升教師健康,聚焦智慧校園人事系統的職工體檢功能

智慧校園人事管理系統內置的職工體檢管理,是專為教職員工設計的一項健康管理創新實踐,巧妙融合先進信息技術,致力于為教職工提供更加便捷、易懂且持續性的健康檢查與管理支持。該服務從多個維度出發,全面呵護教職工的身心健康。 該…