工廠模式:沒你想像的那么難

工廠模式

工廠模式是一種創建型設計模式,它允許創建對象而無需指定將要創建的對象的具體類。它通過將對象的創建委托給一個單獨的方法或類來完成,從而隱藏了對象的實例化邏輯。這樣可以提高代碼的靈活性,減少了代碼中的重復和耦合。

在工廠模式中通常會包含以下幾個要素:

  • 產品接口(Product Interface):定義了要創建的對象的通用接口。
  • 具體產品(Concrete Product):實現了產品接口的具體對象。
  • 工廠接口(Factory Interface):定義了一個創建對象的方法,通常是一個接口或者抽象類。
  • 具體工廠(Concrete Factory):實現了工廠接口,負責創建具體產品的對象。

現在,讓我們通過一個 Python 示例來說明工廠模式的用法。假設我們有一個簡單的圖形繪制應用,它可以繪制圓形和矩形。我們將使用工廠模式來創建這些形狀對象。

# 產品接口:形狀
class Shape:def draw(self):pass# 具體產品:圓形
class Circle(Shape):def draw(self):print("Inside Circle::draw() method.")# 具體產品:矩形
class Rectangle(Shape):def draw(self):print("Inside Rectangle::draw() method.")# 工廠接口
class ShapeFactory:def create_shape(self, shape_type):pass# 具體工廠:形狀工廠
class SimpleShapeFactory(ShapeFactory):def create_shape(self, shape_type):if shape_type.lower() == "circle":return Circle()elif shape_type.lower() == "rectangle":return Rectangle()else:raise ValueError("Unsupported shape type: " + shape_type)# 客戶端代碼
if __name__ == "__main__":# 創建形狀工廠對象shape_factory = SimpleShapeFactory()# 根據工廠創建形狀對象circle = shape_factory.create_shape("circle")circle.draw()rectangle = shape_factory.create_shape("rectangle")rectangle.draw()

在這個示例中,我們定義了 Shape 接口作為產品接口,然后實現了具體的產品類 Circle 和 Rectangle。接著,我們定義了一個工廠接口 ShapeFactory 和一個具體工廠類 SimpleShapeFactory,后者實現了創建形狀對象的方法 create_shape。最后,在客戶端代碼中,我們使用工廠對象來創建具體的形狀對象,而無需直接實例化具體的產品類。

這種設計使得客戶端代碼與具體的產品類解耦,使得在需要添加新的產品類型時,只需要修改工廠類而無需修改客戶端代碼,從而提高了代碼的可維護性和可擴展性。

抽象工廠模式

抽象工廠模式是一種創建型設計模式,它提供了一種創建一系列相關或依賴對象的方法,而無需指定其具體類。該模式通過引入抽象工廠和具體工廠來實現,從而使得客戶端代碼與具體產品類的實現相互獨立。

抽象工廠模式通常涉及以下幾個關鍵組件:

  • 抽象工廠(Abstract Factory):定義了一組方法,用于創建一系列相關或依賴對象的抽象接口。
  • 具體工廠(Concrete Factory):實現了抽象工廠接口,并負責創建具體產品族的對象。
  • 抽象產品(Abstract Product):定義了一組相關或依賴對象的抽象接口。
  • 具體產品(Concrete Product):實現了抽象產品接口的具體對象。

抽象工廠模式與工廠模式相比,其可以創建一組相關的對象,而不僅僅是單個對象。

下面是一個簡單的 Python 示例,演示了抽象工廠模式的應用。假設我們有一個圖形界面庫,它包含按鈕和文本框兩種組件,我們可以根據不同的操作系統(例如 Windows 和 macOS)創建對應的按鈕和文本框。

# 抽象產品:按鈕接口
class Button:def paint(self):pass# 具體產品:Windows 按鈕
class WindowsButton(Button):def paint(self):print("Rendering a Windows style button.")# 具體產品:macOS 按鈕
class MacOSButton(Button):def paint(self):print("Rendering a macOS style button.")# 抽象產品:文本框接口
class TextBox:def paint(self):pass# 具體產品:Windows 文本框
class WindowsTextBox(TextBox):def paint(self):print("Rendering a Windows style text box.")# 具體產品:macOS 文本框
class MacOSTextBox(TextBox):def paint(self):print("Rendering a macOS style text box.")# 抽象工廠:UI 工廠接口
class UIFactory:def create_button(self):passdef create_text_box(self):pass# 具體工廠:Windows UI 工廠
class WindowsUIFactory(UIFactory):def create_button(self):return WindowsButton()def create_text_box(self):return WindowsTextBox()# 具體工廠:macOS UI 工廠
class MacOSUIFactory(UIFactory):def create_button(self):return MacOSButton()def create_text_box(self):return MacOSTextBox()# 客戶端代碼
if __name__ == "__main__":# 根據當前操作系統選擇對應的 UI 工廠os = "windows"  # 可以根據實際情況修改if os.lower() == "windows":ui_factory = WindowsUIFactory()elif os.lower() == "macos":ui_factory = MacOSUIFactory()else:raise ValueError("Unsupported operating system: " + os)# 使用 UI 工廠創建按鈕和文本框button = ui_factory.create_button()text_box = ui_factory.create_text_box()# 渲染按鈕和文本框button.paint()text_box.paint()

在這個示例中,我們定義了抽象產品接口 Button 和 TextBox,以及兩種具體產品類(Windows 和 macOS 版本)。然后,我們定義了抽象工廠接口 UIFactory 和兩個具體工廠類(WindowsUIFactory 和 MacOSUIFactory),分別用于創建 Windows 和 macOS 版本的按鈕和文本框。最后,在客戶端代碼中,我們根據當前操作系統選擇對應的工廠,并使用工廠創建按鈕和文本框,然后調用它們的渲染方法。

?查看原文:工廠模式:沒你想像的那么難

關注公眾號 "字節航海家" 及時獲取最新內容

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

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

相關文章

2021年下半年教師資格證考試《高中信息技術》題

4.使用某轉碼軟件對一段時長為2分鐘的AVI視頻進行轉碼,轉碼后的視頻信息如圖4所示,計算存儲該視頻文件所需的空間大小為(C )。 A18MB B36MB C60MB D512MB 6.某21位二進制代碼100101011010011110101,已知該代碼由3個…

html基礎操練和進階修煉寶典

文章目錄 1.超鏈接標簽2.跳錨點3.圖片標簽4.表格5.表格的方向屬性6.子窗口7.音視頻標簽8.表單9.文件上傳10.input屬性 html修煉必經之路—各種類型標簽詳解加展示&#xff0c;關注點贊加收藏&#xff0c;防止迷路哦 1.超鏈接標簽 <!DOCTYPE html> <html lang"en…

再議【每天進步一點點】

概述 之前聽姜胡說&#xff0c;講到了他自己日更博客的故事&#xff0c;也就是每天去更新一篇博客文章。 日更&#xff0c;其實是一件很可怕的事情。 先不說文章的深度如何&#xff0c;單單從時間的耗費上&#xff0c;文字的積累上&#xff0c;以及對事物的敏感度上&#xf…

vue實現自定義樹形穿梭框功能

需求&#xff1a; 我們在開發過程中&#xff0c;會遇到需要將一個數據選擇做成穿梭框&#xff0c;但是要求穿梭框左側為樹形結構、右側為無層級結構的數據展示&#xff0c;ElementUI自身無法在穿梭框中添加樹形結構&#xff0c;網上搜到了大佬封裝的插件但是對于右側的無樹形結…

【從Python基礎到深度學習】9.Python 語法基礎

一、常量與變量 常量:程序中使用的具體的數、字符。在運行過程中&#xff0c;值無法更改 變量:表示一一個存儲單元&#xff0c;其中存儲的值可以修改 如&#xff1a;a5,b6 變量命名: 1、只能包含字母、數字、下劃線 2、只能以字母、下劃線開頭 3、不要使用關鍵字作為變量名稱 …

不知道倫敦銀模擬賬戶該如何使用?至少3個用法

由于模擬交易的特別屬性&#xff0c;很多人對模擬交易并不用心&#xff0c;假的資金用心干什么&#xff1f;就算交易得再好&#xff0c;盈利得再多&#xff0c;假的資金會變成真的嗎&#xff1f;因此當然不會這么用心對待倫敦銀模擬賬戶交易賬戶。實際上&#xff0c;這種觀點是…

Python 操作數據結構隊列 queue和 雙端隊列 deque

“”" 隊列&#xff08;Queue&#xff09;和雙端隊列&#xff08;Deque, Double-ended Queue&#xff09;都是線性數據結構&#xff0c;但它們在操作上有所不同&#xff1a; 隊列&#xff08;Queue&#xff09;&#xff1a; 隊列遵循先進先出&#xff08;FIFO, First-In…

List集合的Stream流式操作實現數據類型轉換

目錄 問題現象&#xff1a; 問題分析&#xff1a; 解決方法&#xff1a; 拓展&#xff1a; 1、Collectors.toList() 2、Collectors.toCollection(ArrayList::new) 3、Collectors.toCollection(LinkedList::new) 4、Collectors.toCollection(LinkedHashSet::new) 5、Collector…

MAC M1 安裝mongodb7.0.5 版本

1、進入官網 Download MongoDB Community Server | MongoDBDownload MongoDB Community Server non-relational database to take your next big project to a higher level!https://www.mongodb.com/try/download/community 2、選擇版本 3、下載后解壓 放到 /usr/local 并修改…

Facebook Messenger鏈接分享:如何創建鏈接并設置自動化內容

Facebook Messenger鏈接是指基于Facebook用戶名創建的會話鏈接&#xff0c;用戶可以在其Facebook頁面的設置部分復制此鏈接進行分享。然后將該鏈接直接粘貼到獨立站、電子郵件、名片或社交媒體中&#xff0c;讓目標受眾可以一鍵進入對話。為了滿足某些商家的需求&#xff0c;Fa…

vue3中的ref和reactive的區別

vue3中的ref和reactive的區別 1、響應式數據2、ref3、reactive4、ref VS reactive5、往期回顧總結&#xff1a; 1、響應式數據 處理響應式數據時到底是該用ref還是reactive... 響應式數據是指在 Vue.js 中&#xff0c;當數據發生變化時&#xff0c;相關的視圖會自動更新以反映…

【bash】2、手把手實現一個 bash shell:多個機器批量執行 shell 命令,支持 ip 補全

文章目錄 一、需求&#xff1a;多臺機器批量遠程執行 shell 命令1.1 業務需求拆解為腳本需求1.2 幫助函數&#xff1a;使用說明文檔1.3 main 函數框架 二、功能&#xff1a;單機 sshp 執行2.1 fullip 函數&#xff1a;實現 ip 補全2.1.1 參數說明2.1.2 定義全局變量2.1.3 實現&…

Cu-HCP-H035 Cu-HCP-R250銅合金高精度零部件

Cu-HCP-H035 Cu-HCP-R250銅合金高精度零部件 CDA102-3/4H EN1982-CC333G EN1982-CC492K BS1400-LG4 EN1982-CC491K BS1400-LG2 CuNi18Zn19Pb1/CW408J CuNi12Zn38Mn5Pb2/CW407J CuNi12Zn30Pb1/CW406J CuNi12Zn29/CW405J CuNi12Zn25Pb1/CW404J CuNi10Zn42Pb2/CW402J CuNi10Zn27/C…

Pytorch 復習總結 4

Pytorch 復習總結&#xff0c;僅供筆者使用&#xff0c;參考教材&#xff1a; 《動手學深度學習》Stanford University: Practical Machine Learning 本文主要內容為&#xff1a;Pytorch 深度學習計算。 本文先介紹了深度學習中自定義層和塊的方法&#xff0c;然后介紹了一些…

基于Beego 1.12.3的簡單website實現

參考 用Beego開發web應用 https://www.cnblogs.com/zhangweizhong/p/10919672.htmlBeego官網 Homepage - beego: simple & powerful Go app frameworkbuild-web-application-with-golang https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/pr…

源碼的角度分析Vue2數據雙向綁定原理

什么是雙向綁定 我們先從單向綁定切入&#xff0c;其實單向綁定非常簡單&#xff0c;就是把Model綁定到View&#xff0c;當我們用JavaScript代碼更新Model時&#xff0c;View就會自動更新。那么雙向綁定就可以從此聯想到&#xff0c;即在單向綁定的基礎上&#xff0c;用戶更新…

微信開發者工具-代碼管理和碼云Github遠程倉庫集成

目錄 思考&#xff1a;IDE如何進行代碼管理 代碼管理方式 一、自身提供服務 二、Git 擴展 1、環境準備 2、創建項目代碼 3、進行項目Git初始化 4、在碼云新建遠程倉庫 5、將項目進行遠程倉庫關聯 三、SVN擴展 四、代碼管理 思考&#xff1a;IDE如何進行代碼管理 初識開…

服務器部署測試環境回顧與改進建議

任務概述&#xff1a; 原計劃在2小時內完成的任務&#xff0c;由于遇到一系列挑戰&#xff0c;最終耗時1.5天。任務目標是在無外網環境的服務器上建立測試環境&#xff0c;涉及將SSD硬盤數據遷移至服務器、SSH連接、運行測試程序并監控服務器功耗。 高效實施策略&#xff1a;…

fs讀取目錄、文件

fs讀取文件 process.cwd() 是 Node.js 中的一個方法&#xff0c;它返回 Node.js 進程的當前工作目錄。這個工作目錄通常是啟動 Node.js 進程時所在的目錄。 const fs require(fs); const path require(path);// 讀取指定目錄 const configPath path.join(process.cwd(), c…

StarRocks實戰——貝殼找房數倉實踐

目錄 前言 一、StarRocks在貝殼的應用現狀 1.1 歷史的數據分析架構 1.2 OLAP選型 1.2.1 離線場景 1.2.2 實時場景 1.2.3 StarRocks 的引入 二、StarRocks 在貝殼的分析實踐 2.1 指標分析 2.2 實時業務 2.3 可視化分析 三、未來規劃 3.1 StarRocks集群的穩定性 3…