抽象工廠模式(Abstract Factory Pattern)

很好!你現在已經開始接觸設計模式了,而**抽象工廠模式(Abstract Factory Pattern)是一種常用于“創建一系列相關產品”**的經典設計模式。

我會一步步幫你理解:


🧠 一句話解釋

抽象工廠模式:提供一個接口,用于創建一系列相關或相互依賴的對象,而無需指定它們的具體類。


🎯 為什么需要它?

當你面對以下場景時,它就很有用:

“我有多個產品(按鈕、窗口、菜單),而且這些產品有不同的風格(比如 Mac 風格、Windows 風格),希望能在不改代碼的前提下切換整套產品風格。”


? 舉個生活類比

你要布置房間,選一整套家具。你不能桌子 IKEA 風、椅子中式風格,應該風格統一

  • 工廠1:生產一整套「現代風」家具(現代風沙發 + 現代風桌子)
  • 工廠2:生產一整套「中式風」家具(中式風沙發 + 中式風桌子)

→ 你只選工廠,不關心家具內部怎么造。


🧪 Python 完整代碼示例

🧱 Step 1: 抽象產品類

from abc import ABC, abstractmethodclass Button(ABC):@abstractmethoddef click(self):passclass Window(ABC):@abstractmethoddef open(self):pass

🏭 Step 2: 具體產品類

class MacButton(Button):def click(self):print("Mac Button clicked!")class WinButton(Button):def click(self):print("Windows Button clicked!")class MacWindow(Window):def open(self):print("Mac Window opened!")class WinWindow(Window):def open(self):print("Windows Window opened!")

🏗? Step 3: 抽象工廠類

class GUIFactory(ABC):@abstractmethoddef create_button(self) -> Button:pass@abstractmethoddef create_window(self) -> Window:pass

🏢 Step 4: 具體工廠類

class MacFactory(GUIFactory):def create_button(self):return MacButton()def create_window(self):return MacWindow()class WinFactory(GUIFactory):def create_button(self):return WinButton()def create_window(self):return WinWindow()

🖥? Step 5: 客戶端代碼

def render_ui(factory: GUIFactory):button = factory.create_button()window = factory.create_window()button.click()window.open()# 使用 Mac 風格
render_ui(MacFactory())
# 使用 Windows 風格
render_ui(WinFactory())

🧭 流程圖(Mermaid)

GUIFactory
+create_button()
+create_window()
MacFactory
+create_button()
+create_window()
WinFactory
+create_button()
+create_window()
Button
+click()
Window
+open()
MacButton
+click()
WinButton
+click()
MacWindow
+open()
WinWindow
+open()

? 優點

  • ? 保證產品族之間的一致性(按鈕 + 窗口風格一致)
  • ? 封裝創建邏輯,符合開閉原則
  • ? 易于切換產品系列(換工廠即可)

? 缺點

  • ? 類和接口數量增加(每種產品都要寫抽象 + 實現)
  • ? 擴展“新產品”不方便(比如新增菜單)→ 要修改所有工廠

🔚 總結口訣

? 抽象工廠負責生產“產品系列”,只換工廠,不動邏輯。適用于“同一風格的多組件系統”。


如果你希望,我可以把這個例子替換成游戲皮膚工廠、汽車工廠、手機UI工廠來幫助你更貼近生活。你想試試哪個?🎮🚗📱

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

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

相關文章

Thymeleaf模板引擎從入門到實戰:Spring Boot整合與核心用法詳解

在 Java Web 開發的世界里,模板引擎是連接后端數據與前端展示的重要橋梁。Thymeleaf 憑借其強大的功能和簡潔的語法,逐漸成為眾多開發者的首選。如果你正在尋找一款能夠讓你的 Web 應用開發更加高效、代碼更加優雅的模板引擎,那么 Thymeleaf …

【HarmonyOS】作業三 UI

目錄 一. 單選題(共10題,10分) 1. (單選題, 1分)關于Tabs組件頁簽的位置設置,下面描述錯誤的是 2. (單選題, 1分)下面哪個組件不能包含子組件? 3. (單選題, 1分)ArkTS語言的實現計數器功能的組件名稱是以下哪個? 4. (單選題…

《算法筆記》10.6小節——圖算法專題->拓撲排序 問題 C: Legal or Not

題目描述 ACM-DIY is a large QQ group where many excellent acmers get together. It is so harmonious that just like a big family. Every day,many "holy cows" like HH, hh, AC, ZT, lcc, BF, Qinz and so on chat on-line to exchange their ideas. When so…

博客信息管理/博客管理

🛠 博客管理模塊:設計建議 你應該以To B 的后臺系統思路來設計,但保持簡單、輕量級、自己易維護是關鍵。下面是針對你這個場景的建議。 🧱 前端頁面結構(React/Vue 可用) 頁面 說明 博客列表頁 展示所有博…

全平臺開源即時通訊IM框架MobileIMSDK:7端+TCP/UDP/WebSocket協議,鴻蒙NEXT端已發布,5.7K Stars

一、基本介紹 MobileIMSDK是一套全平臺原創開源IM通信層框架: 超輕量級、高度提煉,lib包50KB以內;精心封裝,一套API同時支持UDP、TCP、WebSocket三種協議(可能是全網唯一開源的);客戶端支持iOS…

SpringBoot商城平臺系統設計與開發

概述 SpringBoot商城平臺系統實現了商品展示、購物車、訂單管理等商城核心功能,適合作為計算機專業設計項目或商城項目開發參考,實現商城平臺的核心功能,學習商品管理、訂單處理、支付集成等關鍵技術實現。 主要內容 1. 前臺用戶功能模塊 …

【網絡原理】深入理解HTTPS協議

本篇博客給大家帶來的是網絡原理的知識點, 由于時間有限, 分三天來寫, 本篇為線程第三篇,也是最后一篇. 🐎文章專欄: JavaEE初階 🚀若有問題 評論區見 ? 歡迎大家點贊 評論 收藏 分享 如果你不知道分享給誰,那就分享給薯條. 你們的支持是我不斷創作的動…

【C語言練習】018. 定義和初始化結構體

018. 定義和初始化結構體 018. 定義和初始化結構體1. 定義結構體示例1:定義一個簡單的結構體輸出結果2. 初始化結構體示例2:在聲明時初始化結構體輸出結果示例3:使用指定初始化器初始化結構體(C99及以上標準支持)輸出結果3. 結構體數組示例4:定義和初始化結構體數組輸出結…

3D版同步幀游戲

以下是實現一個3D版同步幀游戲的詳細步驟與完整代碼示例。我們將以第一人稱射擊游戲(FPS)為原型,重點講解3D空間中的同步機制優化。 項目升級:3D版核心改動 1. 3D坐標系與消息結構 // common/messages.go type Vector3 struct {X float32 `json:"x"`Y float32 `…

卷積神經網絡進化史:從LeNet-5到現代架構的完整發展脈絡

摘要 本文系統梳理卷積神經網絡(CNN)從誕生到繁榮的發展歷程。從1998年Yann LeCun開創性的LeNet-5出發,重點解析2012年引爆深度學習革命的AlexNet,并詳細拆解后續演進的五大技術方向:網絡深度化(VGG)、卷積功能強化(ResNet)、檢測任務遷移(F…

在 Windows 中安裝 Pynini 的記錄

#工作記錄 概述 Pynini 是一個用于加權有限狀態文法編譯的 Python 庫,廣泛應用于自然語言處理(NLP)領域。以下記錄旨在用于回顧和幫助大家在 Windows 系統中安裝 Pynini。 安裝思路: 優先用conda虛擬環境 或 在python3.12的vir…

深挖Java之:運算符與輸入器

今天我要介紹的是在Java中對于運算符與輸入器的一些基礎語法運算符與輸入器的代碼示例以及應用場景,他們在應用上的優勢與劣勢作說明介紹: 介紹:運算符與輸入器是兩個基礎且關鍵的概念,它們共同構成了程序與用戶、程序與數據之間…

動態規劃之多狀態問題1

題目解析: 也就是給一個預約數組,選擇一些數字,讓其總和最大,但不能選擇相鄰的兩個數字 算法原理: 依舊可以根據經驗題目 以dp[i]位置結尾時,巴拉巴拉 根據題目要求補充完整,dp[i]&#xff…

計網_可靠傳輸ARQ機制

2024.09.04:網工老姜&beokayy網工學習筆記 第5節 可靠傳輸機制 5.1 可靠傳輸5.2 ARQ機制、ARQ協議5.3 ARQ簡介(可靠傳輸)5.3.1 停止等待協議(1)無差錯情況(2)有差錯情況確認丟失確認遲到 5.…

華為eNSP:多區域集成IS-IS

一、什么是多區域集成IS-IS? 多區域集成IS-IS是一種基于中間系統到中間系統(IS-IS)協議優化的網絡架構設計,通過多區域協同、路徑優化和擴展性增強實現高效路由管理,其核心特征如下: 1、分布式架構與多區…

自定義Dockerfile,發布springboot項目

(1) 上傳jar包 把hello項目打成一個可執行的jar包 hello-1.0-SNAPSHOT.jar,把這個jar包上傳到linux中 (2) 創建文件,文件名my_hello(就是一個Dockerfile),內容如下 #1.定義父鏡像(定義當前工程依賴的環境):…

vscode源代碼管理Tab-文件右側標志(M、A 等)的含義

Git 常用標志(M、A 等)的含義 在 VSCode 的源代碼管理(Source Control)標簽頁中,文件右側顯示的 Monaco 裝飾徽章(Badge)(如 M、A 等),本質上是對 Git 文件狀態標志 的可視化呈現。…

基于 vue-flow 實現可視化流程圖

vue-flow 是一個基于 Vue.js 的強大且靈活的可視化流程圖庫,它允許開發者輕松創建交互式的流程圖、工作流圖、節點圖等。 主要特點 易于使用 :提供了簡潔的 API 和組件,開發者可以快速上手并創建復雜的流程圖。高度可定制 :支持…

【愚公系列】《Manus極簡入門》015-時間管理顧問:“商業時間規劃大師”

🌟【技術大咖愚公搬代碼:全棧專家的成長之路,你關注的寶藏博主在這里!】🌟 📣開發者圈持續輸出高質量干貨的"愚公精神"踐行者——全網百萬開發者都在追更的頂級技術博主! &#x1f…

OpenRouter:輕松集成多家AI大模型的統一接口平臺指南

想象一下,你已經在系統中集成了 OpenAI API,但現在你希望通過 Google Gemini 和 Anthropic API 擴展能力。你會為每個服務商單獨創建和管理賬戶,使用不同的 SDK,讓代碼變得更加復雜嗎?還是更傾向于只用一行代碼就能訪問…