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

什么是工廠方法模式?

工廠方法模式(Factory Method Pattern)是 創建型設計模式之一,目的是通過定義一個用于創建對象的接口,讓子類決定實例化哪個類。簡而言之,工廠方法模式通過延遲對象的創建過程到子類來減少代碼耦合,使得代碼更加靈活且易于擴展。

工廠方法模式的核心思想

  • 工廠方法模式通過將對象的創建過程交給子類來實現解耦,這使得代碼更加靈活,能夠應對需求變化時的擴展。
  • 客戶端不需要知道具體的類名,只需要通過工廠方法獲取所需的對象。
  • 它是“簡單工廠模式”的擴展,解決了簡單工廠模式中單一工廠類引起的復雜性問題。

主要組成部分

工廠方法模式的實現通常包括以下幾個關鍵組件:

  1. 產品(Product):定義產品的接口,所有具體的產品類都實現該接口。
  2. 具體產品(ConcreteProduct):實現產品接口的具體類,代表某種具體的產品。
  3. 工廠方法(Creator):聲明工廠方法,返回一個產品對象。通常它是一個抽象類或接口。
  4. 具體工廠(ConcreteCreator):實現工廠方法,返回具體的產品對象。

工廠方法模式的代碼實現

為了幫助大家理解工廠方法模式,下面我們通過一個具體的例子來實現它。假設我們正在開發一個圖形繪制應用,支持不同類型的圖形(如圓形和方形)。我們將通過工廠方法來創建不同的圖形對象。

1. 定義產品接口

首先,我們定義一個 Shape 接口,所有的具體圖形類(如 CircleSquare)都需要實現這個接口。

from abc import ABC, abstractmethodclass Shape(ABC):@abstractmethoddef draw(self):pass

2. 創建具體產品類

接下來,我們創建兩個具體的產品類,CircleSquare,它們分別實現 Shape 接口。

class Circle(Shape):def draw(self):print("Drawing a Circle!")class Square(Shape):def draw(self):print("Drawing a Square!")

3. 定義工廠方法接口

然后,我們定義一個 ShapeFactory 接口,聲明一個 create_shape 方法,返回一個 Shape 對象。

class ShapeFactory(ABC):@abstractmethoddef create_shape(self) -> Shape:pass

4. 創建具體工廠類

接下來,我們創建兩個具體工廠類,CircleFactorySquareFactory,它們分別負責創建 CircleSquare 對象。

class CircleFactory(ShapeFactory):def create_shape(self) -> Shape:return Circle()class SquareFactory(ShapeFactory):def create_shape(self) -> Shape:return Square()

5. 客戶端代碼

在客戶端代碼中,我們通過工廠方法來創建圖形對象,而不直接實例化具體類。

def draw_shape(factory: ShapeFactory):shape = factory.create_shape()shape.draw()# 客戶端代碼示例
circle_factory = CircleFactory()
draw_shape(circle_factory)square_factory = SquareFactory()
draw_shape(square_factory)

輸出

Drawing a Circle! 
Drawing a Square! 

工廠方法模式的優勢

  1. 解耦對象創建和使用:客戶端不需要關心具體類的實現細節,而是通過工廠方法獲取所需對象,這減少了與具體類的依賴。
  2. 擴展性強:新增產品類時,只需要添加新的具體工廠類,而不需要修改現有代碼,符合開閉原則。
  3. 靈活性高:工廠方法模式使得客戶端代碼對具體類的依賴最小,提升了代碼的靈活性和可維護性。

工廠方法模式 vs 簡單工廠模式

盡管工廠方法模式和簡單工廠模式看起來類似,但它們在設計上有一些顯著的差異:

  • 簡單工廠模式:一個工廠類負責創建所有類型的對象,客戶端通過傳遞參數來決定創建哪個具體類的實例。缺點是隨著產品種類增加,工廠類的代碼會變得復雜,不易維護。

  • 工廠方法模式:每個具體工廠類負責創建一種特定類型的對象。客戶端不需要關心對象的創建過程,只需要使用工廠方法來獲取所需的對象。相比簡單工廠模式,工廠方法模式在產品增加時不會讓工廠類變得臃腫,代碼更加靈活和可擴展。

適用場景

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

  • 產品類的創建過程復雜,且希望將創建過程封裝起來,減少客戶端與具體產品類的耦合。
  • 不希望讓客戶端知道產品的具體類名,而是通過工廠方法獲取。
  • 希望在產品種類增加時,能夠通過擴展工廠類來支持新的產品,而不是修改現有代碼。

總結

工廠方法模式是一個非常強大的設計模式,它通過將對象的創建過程委托給子類工廠,減少了代碼的耦合性,提高了系統的靈活性與可擴展性。它非常適合于產品種類不斷增加且每種產品創建邏輯不同的場景。

理解并掌握工廠方法模式,可以幫助開發者在面對日益復雜的系統時,編寫出更加靈活、可維護的代碼。

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

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

相關文章

【Unity3D】ECS入門學習(十二)IJob、IJobFor、IJobParallelFor

IJob&#xff1a;開啟單個線程進行計算&#xff0c;線程內不允許對同一個數據進行操作&#xff0c;也就是如果你想用多個IJob分別計算&#xff0c;將其結果存儲到同一個NativeArray<int>數組是不允許的&#xff0c;所以不要這樣做&#xff0c;如下例子就是反面教材&#…

Spring 創建和管理 Bean 的原理,以及Spring 的單例模式是否線程安全?(有無狀態Bean)

Spring 是一個輕量級的開源框架&#xff0c;廣泛應用于 Java 企業級應用的開發。它提供了一個全面的、基于 IOC&#xff08;控制反轉&#xff09;和 AOP&#xff08;面向切面編程&#xff09;的容器&#xff0c;可以幫助開發者更好地管理應用程序中的對象。 Spring 創建和管理…

Docker容器鏡像制作

Docker鏡像的基本概念 1. 什么是Docker鏡像&#xff1f; Docker鏡像是一種輕量級、可執行的軟件包&#xff0c;包含運行某個應用所需的所有代碼、庫、依賴項和配置文件。它的形成是一種“打包”和“快照”過程&#xff0c;使得應用能夠在不同環境中保持一致的功能表現。 2. …

InfoNCE Loss詳解(上)

引言 InfoNCE對比學習損失是學習句嵌入繞不開的知識點&#xff0c;本文就從頭開始來探討一下它是怎么來的。 先驗知識 數學期望與大數定律 期望(expectation&#xff0c;expected value&#xff0c;數學期望&#xff0c;mathematical expectation)是隨機變量的平均值&#…

.Net加密與Java互通

.Net加密與Java互通 文章目錄 .Net加密與Java互通前言RSA生成私鑰和公鑰.net加密出數據傳給Java端采用java方給出的公鑰進行加密采用java方給出的私鑰進行解密 .net 解密來自Java端的數據 AES帶有向量的AES加密帶有向量的AES解密無向量AES加密無向量AES解密 SM2(國密)SM2加密Sm…

工作中常用Vim的命令

Hi, 我是你們的老朋友&#xff0c;主要專注于嵌入式軟件開發&#xff0c;有興趣不要忘記點擊關注【碼思途遠】 目錄 0. ctags -R 1.認識 Vim的幾種工作模式 2.高頻使用命令 2.1 修改文件 2.2 關于行號 2.3 刪除多行&#xff0c;刪除部分 2.4 復制粘貼 2.5 光標移動 2.…

如何在 Vue 2 中使用 Swiper 5.4.5 處理靜態與后端數據不能切換問題

一、文章大綱 1.前言 介紹 Swiper 作為一款強大的輪播組件,常用于處理圖片、文章、商品等內容的滑動展示。 在 Vue.js 項目中集成 Swiper,尤其是在 Vue 2 中使用,常見的兩種數據來源:靜態數據與后端數據。 在 Vue 2 項目中集成 Swiper 5.4.5 2.如何通過 npm 安裝 Swiper…

究極炫酷3D立方體宇宙

演示動畫&#xff1a;https://life.mdjsjd.me/2024/12/27/3d-cube-animation/ 一個使用Python和Pygame制作的炫酷3D立方體動畫效果。結合了多種視覺特效,包括: 動態旋轉的3D立方體炫彩漸變的顏色系統星空背景粒子效果動態殘影拖尾效果深度透視投影 主要特性 動態變換: 立方…

什么是 Azure OpenAI ?了解微軟 Azure OpenAI 和 OpenAI 的關系

一、什么是Azure OpenAI &#xff1f; 微軟已與 OpenAI 合作以實現三個主要目標&#xff1a; ?利用 Azure 的基礎結構&#xff08;包括安全性、合規性和區域可用性&#xff09;&#xff0c;幫助用戶構建企業級應用程序。 ?在微軟產品&#xff08;包括 Azure AI 產品以及以外…

Linux day 1129

家人們今天繼續學習Linux&#xff0c;ok話不多說一起去看看吧 三.Linux常用命令 3.1 Linux命令體驗 3.1.1 常用命令演示 在這一部分中&#xff0c;我們主要介紹幾個常用的命令&#xff0c;讓大家快速感 受以下 Linux 指令的操作方式。主要包含以下幾個指令&#xff1a; ls命…

mysql8 從C++源碼角度看 Statement cancelled due to timeout or client request異常

##Statement cancelled due to timeout or client request 異常 Caused by: com.mysql.jdbc.exceptions.MySQLTimeoutException: Statement cancelled due to timeout or client requestat com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1932)at …

【數據結構-單調隊列】力扣1438. 絕對差不超過限制的最長連續子數組

給你一個整數數組 nums &#xff0c;和一個表示限制的整數 limit&#xff0c;請你返回最長連續子數組的長度&#xff0c;該子數組中的任意兩個元素之間的絕對差必須小于或者等于 limit 。 如果不存在滿足條件的子數組&#xff0c;則返回 0 。 示例 1&#xff1a; 輸入&#x…

SAP HCM 標準報表與前臺操作的增強差異邏輯分析(rhgrenz4)

導讀 增強差異:SAP的HCM模塊組織和人事增強都有標準的增強點&#xff0c;不管你調用標準的函數還是前臺操作都會觸發對應的增強。所以很多業務不需要考慮那么多分散點&#xff0c;只要找到一個合適的增強點&#xff0c;就能解決很多和外圍系統集成的業務邏輯&#xff0c;今天遇…

【Spring】Spring DI(依賴注入)詳解——自動裝配——手動裝配與自動裝配的區別

在spring開發中&#xff0c;依賴注入&#xff08;Dependency Injection&#xff0c;DI&#xff09;是實現松耦合和高內聚設計的重要模式。它使得對象的創建和管理與其依賴關系分離&#xff0c;從而提高了代碼的可維護性、可測試性和靈活性。Spring框架通過IoC&#xff08;控制反…

EZ-USB? FX3 USB 5 Gbps 外設控制器

EZ-USB? FX3 USB 5 Gbps 外設控制器 EZ-USB? FX3 提供 USB 5Gbps 至 32 位數據總線&#xff0c;并配備 ARM9&#xff0c;可為任何系統添加 USB 3.0 連接 英飛凌的 EZ-USB? FX3 是業界用途最廣泛的 USB 外圍設備控制器&#xff0c;可以為幾乎任何系統添加 USB 5Gbps 連接。 …

【數據倉庫】spark大數據處理框架

文章目錄 概述架構spark 架構角色下載安裝啟動pyspark啟動spark-sehll啟動spark-sqlspark-submit經驗 概述 Spark是一個性能優異的集群計算框架&#xff0c;廣泛應用于大數據領域。類似Hadoop&#xff0c;但對Hadoop做了優化&#xff0c;計算任務的中間結果可以存儲在內存中&a…

數據庫容災備份的意義+分類+執行工具!

數據庫容災解決方案的背景 數據庫容災&#xff08;Disaster Recovery&#xff0c;DR&#xff09;解決方案的背景主要源于企業對數據安全性、業務連續性和系統高可用性的需求。隨著數字化轉型的加速&#xff0c;企業的數據量迅猛增長&#xff0c;數據庫已成為支撐核心業務的關鍵…

PDF怎么壓縮得又小又清晰?5種PDF壓縮方法

PDF 文件在日常辦公與學習中使用極為頻繁&#xff0c;可想要把它壓縮得又小又清晰卻困難重重。一方面&#xff0c;PDF 格式本身具有高度兼容性&#xff0c;集成了文字、圖像、矢量圖等多樣元素&#xff0c;壓縮時難以兼顧不同元素特性&#xff0c;稍不注意&#xff0c;文字就會…

SpringBoot數據字典字段自動生成對應code和desc

效果&#xff1a;接口會返回orderType&#xff0c;但是這個orderType是枚舉的類型&#xff08;1&#xff0c;2&#xff0c;3&#xff0c;4&#xff09;&#xff0c;我想多返回一個orderTypeDesc給前端展示&#xff0c;這樣前端就可以直接拿orderTypeDesc使用了。 1. 定義注解 …

【YashanDB知識庫】imp導入數據庫時,報錯YAS-08023

本文內容來自YashanDB官網&#xff0c;原文內容請見 https://www.yashandb.com/newsinfo/7849010.html?templateId1718516 **【問題分類】**數據導入導出 **【關鍵字】**imp、YAS-08023 【問題描述】 導出數據庫時&#xff0c;使用以下命令&#xff0c;導出正常&#xff1…