工廠函數詳解:概念、目的與作用

在這里插入圖片描述

一、什么是工廠函數?

工廠函數(Factory Function)是一種設計模式,其核心是通過一個函數來 創建并返回對象,而不是直接使用 new 或構造函數實例化對象。它封裝了對象的創建過程,使代碼更靈活、可維護。


二、工廠函數的目的與作用
目的作用
解耦對象創建邏輯將對象的創建與使用分離,調用者無需關心對象的具體實現細節。
延遲實例化僅在需要時創建對象,避免資源浪費(如內存、CPU)。
支持動態參數根據輸入參數返回不同類型的對象(多態性)。
統一接口提供標準化的對象創建方式,便于擴展和維護。

三、工廠函數示例
1. 簡單工廠:形狀創建

假設需要根據用戶輸入創建不同形狀(圓形、矩形),直接實例化會導致代碼冗余和耦合:

# 無工廠函數的問題
if shape_type == 'circle':obj = Circle(radius=5)
elif shape_type == 'rectangle':obj = Rectangle(width=3, height=4)

使用工廠函數優化后:

# 定義形狀類
class Circle:def __init__(self, radius):self.radius = radiusclass Rectangle:def __init__(self, width, height):self.width = widthself.height = height# 工廠函數
def shape_factory(shape_type, **kwargs):if shape_type == 'circle':return Circle(**kwargs)elif shape_type == 'rectangle':return Rectangle(**kwargs)else:raise ValueError("Unknown shape type")# 調用
circle = shape_factory('circle', radius=5)
rectangle = shape_factory('rectangle', width=3, height=4)
2. Mininet 中的工廠函數

在 Mininet 自定義拓撲中,lambda: MyTopo() 是一個工廠函數:

# 工廠函數:延遲創建 MyTopo 實例
topos = {'mytopo': (lambda: MyTopo())}

當 Mininet 需要構建拓撲時,會調用 topos['mytopo']() 執行 Lambda 函數,動態生成 MyTopo 實例。


四、工廠函數的優勢
1. 避免緊耦合
  • 直接實例化:調用方需知道具體類的構造函數。
  • 工廠函數:調用方只需傳遞參數,無需了解類細節。
2. 靈活擴展

新增對象類型時,只需修改工廠函數,無需修改調用代碼。

# 擴展支持三角形
class Triangle:def __init__(self, base, height):self.base = baseself.height = heightdef shape_factory(shape_type, **kwargs):# 原有邏輯...elif shape_type == 'triangle':return Triangle(**kwargs)
3. 資源管理

延遲實例化可節省內存和計算資源,尤其是在對象創建成本高時(如數據庫連接)。


五、工廠函數 vs 直接實例化
場景直接實例化工廠函數
簡單對象創建適合(如 obj = MyClass()過渡設計
復雜/條件化創建代碼冗余,難以維護統一管理,邏輯清晰
需要延遲加載無法實現天然支持
多態性需求需手動判斷類型封裝在工廠中,對調用方透明

六、工廠模式的其他形式
  1. 工廠方法模式
    每個子類實現自己的工廠方法(面向對象設計中的經典模式)。

  2. 抽象工廠模式
    創建一組相關或依賴對象的接口(如 GUI 庫中的跨平臺組件)。


七、總結
  • 核心思想:工廠函數通過封裝對象創建邏輯,提升代碼的靈活性和可維護性。
  • 在 Mininet 中的應用lambda: MyTopo() 作為工廠函數,確保 Mininet 在運行時動態創建拓撲實例。
  • 適用場景:對象創建邏輯復雜、需要延遲加載或支持多態性時優先使用。

通過合理使用工廠函數,可以顯著提高代碼的模塊化程度,降低系統各部分之間的依賴。

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

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

相關文章

旋轉位置編碼(Rotary Positional Encoding, RoPE):中文公式詳解與代碼實現

旋轉位置編碼(Rotary Positional Encoding, RoPE):中文公式詳解與代碼實現 在序列模型中,位置信息對于任務的理解至關重要。傳統的絕對和相對位置編碼各有優缺點,而RoPE作為一種創新的位置編碼方法,展現了…

C語言-指針變量和變量指針

指針 預備知識 內存地址 字節:字節是內存的容量單位,英文名Byte,1Byte8bits 地址:系統為了便于區分每一個字節面對它們的逐一進行編號(編號是唯一的),稱為內存地址,簡稱地址。int…

unityAB包(1/2)

unityAB包學習 1.AB包的導出擴展BuildAssetBundleOptions無特殊選項壓縮相關選項 2.AB包資源管理3.Resource和AssetBundle加載方式的區別4.預設體5.Unity Asset Bundle Browser 工具5為什么要勾選拷貝到StreamingAsset里面。6.AB包的加載 1.AB包的導出 首先在Project窗口&…

算法——廣度優先搜索——跨步迷宮

原題鏈接 思路:找出最短路徑,然后判斷是否存在連續三個點是橫縱坐標相等的,如果有就步數減1 但是有兩個樣例過不了 錯誤原因:在錯誤的測試案例中,最短路徑可能有多條,而我剛好選了一條比較曲折的&#x…

某酒企數字化轉型及電商規劃項目啟動會暨培訓會v(60頁PPT)(文末有下載方式)

詳細資料請看本解讀文章的最后內容。 在當今數字化浪潮席卷之下,企業的發展面臨著前所未有的機遇與挑戰。對于某酒企而言,數字化轉型和電商規劃已成為其實現 “二次騰飛”、邁向世界級酒企的關鍵戰略舉措。本次啟動會暨培訓會,為該酒企的轉型…

NET6 WebApi第5講:中間件(源碼理解,俄羅斯套娃怎么來的?);Web 服務器 (Nginx / IIS / Kestrel)、WSL、SSL/TSL

一、NET6的啟動流程 區別: .NET6 WebApi第1講:VSCode開發.NET項目、區別.NET5框架【兩個框架啟動流程詳解】_vscode webapi-CSDN博客 2、WebApplicationBuilder:是NET6引入的一個類,是建造者模式的典型應用 1>建造者模式的…

vue中根據html動態渲染內容

需求&#xff1a;根據數據中的html&#xff0c;因為我是在做填空&#xff0c;所以是需要將html中的_____替換成input&#xff0c;由于具體需求我使用的是元素contenteditable代替的可編輯的input html部分 <div class"wrap"><component :is"rendered…

【AI】AI編程助手:Cursor、Codeium、GitHub Copilot、Roo Cline、Tabnine

文章目錄 一、基本特性對比二、收費標準三、私有部署能力1、Tabnine2、Roo Code 三、代碼補全與自然語言生成代碼四、安裝獨立的IDE安裝插件安裝 五、基本使用&#xff08;一&#xff09;Cursor&#xff08;二&#xff09;GitHub Copilot1、獲取代碼建議2.聊天1&#xff09;上下…

三軸云臺之角速度信號篇

三軸云臺的角速度信號主要通過其內置的傳感器&#xff08;如陀螺儀&#xff09;來感知和測量。 一、角速度信號的感知與測量 在三軸云臺中&#xff0c;陀螺儀是測量角速度的關鍵組件。它通常安裝在三個互相垂直的軸上&#xff08;通常為X、Y、Z軸&#xff09;&#xff0c;能夠…

Grid 布局實現三欄布局

使用 CSS Grid 布局實現三欄布局(左右固定 100px,中間自適應)的核心原理是通過網格模板精確控制列寬分配。以下是具體實現方法及優化技巧: 一、基礎實現 ?父容器設置 為外層容器添加 display: grid 使其成為網格容器,并通過 grid-template-columns 定義列寬 css .contain…

綠盟春招實習一面

《網安面試指南》https://mp.weixin.qq.com/s/RIVYDmxI9g_TgGrpbdDKtA?token1860256701&langzh_CN 5000篇網安資料庫https://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247486065&idx2&snb30ade8200e842743339d428f414475e&chksmc0e4732df793fa3bf39…

進制轉換(R轉十)(1290. 二進制轉換十進制、1292. 十六進制轉十進制、1291. 八進制轉十進制、1405. 小麗找潛在的素數)

題單地址&#xff1a;題單中心-東方博宜OJ 這里以二進制轉十進制為例&#xff08;按位加權求和法&#xff09; 1290. 二進制轉換十進制 問題描述 請將一個 25 位以內的 2 進制正整數轉換為 1010 進制&#xff01; 輸入 一個 25 位以內的二進制正整數。 輸出 該數對應的…

Redis 本地安裝

首先安裝&#xff1a; https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/install-redis-from-source/ 進入root目錄 tar -xzvf redis-stable.tar.gz cd redis-stable make然后 install sudo make install最后可以直接啟動 redis-server但是此時啟…

9.嗅探與Wireshark進階分析

嗅探與Wireshark進階分析 第一部分&#xff1a;嗅探的概念與重要性第二部分&#xff1a;Wireshark進階功能第三部分&#xff1a;嗅探實踐與分析總結 目標&#xff1a; ? 理解嗅探&#xff08;Sniffing&#xff09;的概念及其在網絡安全中的作用 ? 掌握Wireshark的進階功能&a…

在 VSCode 遠程開發環境下使用 Git 常用命令

在日常開發過程中&#xff0c;無論是單人項目還是團隊協作&#xff0c;Git 都是版本管理的利器。尤其是在使用 VSCode 連接遠程服務器進行代碼開發時&#xff0c;Git 不僅能幫助你管理代碼版本&#xff0c;還能讓多人協作變得更加高效。本文將介紹一些常用的 Git 命令&#xff…

npm 命令使用文檔

目錄 簡介安裝與配置基礎命令依賴管理版本控制腳本管理包發布高級命令配置管理最佳實踐常見問題 1. 簡介 npm (Node Package Manager) 是 Node.js 的官方包管理工具&#xff0c;提供&#xff1a; 130萬 開源包的注冊表訪問依賴解析與版本管理項目腳本自動化私有包管理能力完…

【Linux篇】進程控制

&#x1f4cc; 個人主頁&#xff1a; 孫同學_ &#x1f527; 文章專欄&#xff1a;Liunx &#x1f4a1; 關注我&#xff0c;分享經驗&#xff0c;助你少走彎路&#xff01; 1. 進程創建 1.1 fork函數 在linux中fork函數是非常重要的函數&#xff0c;它從已存在進程中創建一個…

HyperAD:學習弱監督音視頻暴力檢測在雙曲空間中的方法

文章目錄 速覽摘要1. 引言2. 相關工作弱監督暴力檢測雙曲空間中的神經網絡 3. 預備知識雙曲幾何切空間&#xff08;Tangent Space&#xff09;指數映射與對數映射&#xff08;Exponential and Logarithmic Maps&#xff09;3.1 雙曲圖卷積網絡&#xff08;Hyperbolic Graph Con…

動態規劃(6.不同路徑II)

題目鏈接&#xff1a;63. 不同路徑 II - 力扣&#xff08;LeetCode&#xff09; 解法&#xff1a; 本題為不同路徑的變型&#xff0c;只不過有些地方有「障礙物」&#xff0c;只要在「狀態轉移」上稍加修改就可解決。 狀態表示&#xff1a; 對于這種Γ路徑類」的問題&#xf…

深度洞察:DeepSeek 驅動金融行業智能化轉型變革

該文章為軟件測評&#xff0c;不是廣告&#xff01;&#xff01;&#xff01;&#xff01; 目錄 一.金融行業的智能化轉型浪潮? 二.DeepSeek的核心技術剖析 1.DeepSeek 模型的金融智慧? 2.實時聯網搜索&#xff1a;把握金融市場脈搏? 3.RAG 能力&#xff1a;鑄就精準金…