設計模式之工廠模式(factory pattern):在商品對象創建系統中的應用

目錄

一、設計思路

1. 簡單工廠模式

2. 工廠方法模式

3. 抽象工廠模式

二、UML類圖(PlantUML格式)

1.簡單工廠模式

2.工廠方法模式

3.抽象工廠模式

三、實現過程與結果

1. 簡單工廠模式

2. 工廠方法模式

3. 抽象工廠模式

四、總結

????????在面向對象設計中,工廠模式是一種常用的創建型設計模式,它通過將對象的創建邏輯集中管理,使得客戶端無需直接創建對象,而是通過工廠類來獲取所需的對象實例。這種設計思想不僅提高了代碼的可擴展性和可維護性,還增強了系統的靈活性。本文將通過一個鼠標和鍵盤的商品對象創建系統,詳細探討簡單工廠模式、工廠方法模式和抽象工廠模式的應用。

一、設計思路

1. 簡單工廠模式

簡單工廠模式通過一個統一的工廠類來創建對象,客戶端通過傳遞類型參數來指定需要創建的對象。這種模式適合產品種類較少且不會頻繁變化的場景。

  • 鼠標接口:定義鼠標的基本行為。

  • 具體鼠標類:實現無線鼠標和有線鼠標類,分別實現鼠標接口。

  • 鼠標工廠類:根據傳入的類型參數創建相應的鼠標對象。

2. 工廠方法模式

工廠方法模式通過定義一個抽象工廠接口,讓具體的工廠類實現該接口來創建對象。客戶端通過使用抽象工廠接口,而不直接調用具體工廠類。這種模式適合產品種類較多且可能頻繁變化的場景。

  • 鼠標接口:定義鼠標的基本行為。

  • 具體鼠標類:實現無線鼠標和有線鼠標類。

  • 抽象工廠接口:聲明創建鼠標的方法。

  • 具體工廠類:實現抽象工廠接口,分別創建無線鼠標和有線鼠標。

3. 抽象工廠模式

抽象工廠模式通過一個抽象工廠接口來創建多個相關的產品族。具體工廠實現該接口,生產一組相關的產品。這種模式適合需要創建多個相關產品族的場景。

  • 鼠標接口:定義鼠標的基本行為。

  • 鍵盤接口:定義鍵盤的基本行為。

  • 具體產品類:實現無線鼠標、有線鼠標、無線鍵盤和有線鍵盤類。

  • 抽象工廠接口:聲明創建鼠標和鍵盤的方法。

  • 具體工廠類:實現抽象工廠接口,分別創建無線設備(鼠標和鍵盤)和有線設備(鼠標和鍵盤)。

二、UML類圖(PlantUML格式)

1.簡單工廠模式

@startuml
interface Mouse {+ make()
}class WirelessMouse {+ make()
}class WiredMouse {+ make()
}class MouseFactory {+ createMouse(type: String): Mouse
}Mouse <|.. WirelessMouse
Mouse <|.. WiredMouse
MouseFactory --> Mouse
@enduml

2.工廠方法模式

@startuml
interface Mouse {+ make()
}class WirelessMouse {+ make()
}class WiredMouse {+ make()
}interface MouseFactory {+ createMouse(): Mouse
}class WirelessMouseFactory {+ createMouse(): Mouse
}class WiredMouseFactory {+ createMouse(): Mouse
}Mouse <|.. WirelessMouse
Mouse <|.. WiredMouse
MouseFactory <|.. WirelessMouseFactory
MouseFactory <|.. WiredMouseFactory
@enduml

3.抽象工廠模式

@startuml
interface Mouse {+ make()
}interface Keyboard {+ make()
}class WirelessMouse {+ make()
}class WiredMouse {+ make()
}class WirelessKeyboard {+ make()
}class WiredKeyboard {+ make()
}interface DeviceFactory {+ createMouse(): Mouse+ createKeyboard(): Keyboard
}class WirelessDeviceFactory {+ createMouse(): Mouse+ createKeyboard(): Keyboard
}class WiredDeviceFactory {+ createMouse(): Mouse+ createKeyboard(): Keyboard
}Mouse <|.. WirelessMouse
Mouse <|.. WiredMouse
Keyboard <|.. WirelessKeyboard
Keyboard <|.. WiredKeyboard
DeviceFactory <|.. WirelessDeviceFactory
DeviceFactory <|.. WiredDeviceFactory
@enduml

三、實現過程與結果

1. 簡單工廠模式

代碼實現:

public interface Mouse {void make();
}public class WirelessMouse implements Mouse {@Overridepublic void make() {System.out.println("制造無線鼠標");}
}public class WiredMouse implements Mouse {@Overridepublic void make() {System.out.println("制造有線鼠標");}
}public class MouseFactory {public Mouse createMouse(String type) {if ("wireless".equalsIgnoreCase(type)) {return new WirelessMouse();} else if ("wired".equalsIgnoreCase(type)) {return new WiredMouse();} else {return null;}}
}public class Demo {public static void main(String[] args) {MouseFactory factory = new MouseFactory();Mouse wirelessMouse = factory.createMouse("wireless");Mouse wiredMouse = factory.createMouse("wired");wirelessMouse.make(); // 輸出:制造無線鼠標wiredMouse.make();    // 輸出:制造有線鼠標}
}

2. 工廠方法模式

代碼實現:

public interface Mouse {void make();
}public class WirelessMouse implements Mouse {@Overridepublic void make() {System.out.println("制造無線鼠標");}
}public class WiredMouse implements Mouse {@Overridepublic void make() {System.out.println("制造有線鼠標");}
}public interface MouseFactory {Mouse createMouse();
}public class WirelessMouseFactory implements MouseFactory {@Overridepublic Mouse createMouse() {return new WirelessMouse();}
}public class WiredMouseFactory implements MouseFactory {@Overridepublic Mouse createMouse() {return new WiredMouse();}
}public class Demo {public static void main(String[] args) {MouseFactory wirelessFactory = new WirelessMouseFactory();MouseFactory wiredFactory = new WiredMouseFactory();Mouse wirelessMouse = wirelessFactory.createMouse();Mouse wiredMouse = wiredFactory.createMouse();wirelessMouse.make(); // 輸出:制造無線鼠標wiredMouse.make();    // 輸出:制造有線鼠標}
}

3. 抽象工廠模式

代碼實現:

public interface Mouse {void make();
}public interface Keyboard {void make();
}public class WirelessMouse implements Mouse {@Overridepublic void make() {System.out.println("制造無線鼠標");}
}public class WiredMouse implements Mouse {@Overridepublic void make() {System.out.println("制造有線鼠標");}
}public class WirelessKeyboard implements Keyboard {@Overridepublic void make() {System.out.println("制造無線鍵盤");}
}public class WiredKeyboard implements Keyboard {@Overridepublic void make() {System.out.println("制造有線鍵盤");}
}public interface DeviceFactory {Mouse createMouse();Keyboard createKeyboard();
}public class WirelessDeviceFactory implements DeviceFactory {@Overridepublic Mouse createMouse() {return new WirelessMouse();}@Overridepublic Keyboard createKeyboard() {return new WirelessKeyboard();}
}public class WiredDeviceFactory implements DeviceFactory {@Overridepublic Mouse createMouse() {return new WiredMouse();}@Overridepublic Keyboard createKeyboard() {return new WiredKeyboard();}
}public class Demo {public static void main(String[] args) {DeviceFactory wirelessFactory = new WirelessDeviceFactory();DeviceFactory wiredFactory = new WiredDeviceFactory();Mouse wirelessMouse = wirelessFactory.createMouse();Keyboard wirelessKeyboard = wirelessFactory.createKeyboard();Mouse wiredMouse = wiredFactory.createMouse();Keyboard wiredKeyboard = wiredFactory.createKeyboard();wirelessMouse.make(); // 輸出:制造無線鼠標wirelessKeyboard.make(); // 輸出:制造無線鍵盤wiredMouse.make();    // 輸出:制造有線鼠標wiredKeyboard.make();  // 輸出:制造有線鍵盤}
}

四、總結

工廠模式的三種主要形式及其適用場景。每種模式都有其獨特的優點和適用范圍,合理選擇和應用這些模式可以顯著提升軟件設計的質量和效率。

  1. 簡單工廠模式:簡單工廠模式以其簡潔性和易于理解的特點,非常適合產品種類較少且相對穩定的場景。它通過一個統一的工廠類集中管理對象的創建邏輯,使得客戶端代碼更加簡潔。然而,隨著產品種類的增加,簡單工廠類的條件判斷邏輯可能會變得復雜,這可能會降低代碼的可維護性。

  2. 工廠方法模式:工廠方法模式通過將對象的創建邏輯分散到多個具體的工廠類中,有效地解決了簡單工廠模式在面對產品種類頻繁變化時的擴展性問題。每個具體工廠類負責創建一種具體的產品,這使得系統在添加新產品時更加靈活,只需新增相應的工廠類而無需修改現有代碼。這種模式特別適合產品種類較多且可能頻繁變化的場景,它不僅提高了代碼的可擴展性,還符合開閉原則,即對擴展開放,對修改關閉。

  3. 抽象工廠模式:抽象工廠模式在處理多個相關產品族的創建時表現出色。它通過一個抽象工廠接口定義了一組創建相關產品的方法,具體工廠實現這些方法來生產特定產品族中的產品。這種模式使得系統能夠在不依賴具體產品實現的情況下,靈活地切換不同的產品族。這對于需要支持多種產品組合的系統來說是一個巨大的優勢,它不僅提高了代碼的可維護性,還增強了系統的靈活性和可擴展性。

????????在實際的軟件開發中,選擇合適的工廠模式需要綜合考慮系統的復雜性、產品的種類和變化頻率以及系統的擴展需求。簡單工廠模式適合小型項目或產品種類較少的場景;工廠方法模式適用于產品種類較多且可能頻繁變化的系統;而抽象工廠模式則更適合需要創建多個相關產品族的復雜系統。

????????此外,工廠模式的應用還體現了面向對象設計的核心原則,如封裝、多態和依賴倒置等。通過將對象的創建邏輯封裝在工廠類中,客戶端代碼可以依賴于抽象而非具體實現,這使得系統更加靈活,能夠更好地應對需求的變化。

????????總之,工廠模式作為一種經典的創建型設計模式,為對象的創建提供了一種優雅的解決方案。它不僅能夠提高代碼的可讀性和可維護性,還能夠增強系統的擴展性和靈活性。在未來的軟件設計中,合理運用工廠模式將有助于我們構建出更加健壯、靈活和易于維護的軟件系統。

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

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

相關文章

Trae,字節跳動推出的 AI 編程助手插件

Trae 插件是 Trae 旗下全新一代的人工智能編程助手&#xff08;前身為 MarsCode 編程助手&#xff09;&#xff0c;以插件形式集成在本地開發環境中&#xff0c;具備極高的兼容性和靈活性&#xff0c;旨在提升開發效率和代碼質量。它支持超過100種編程語言&#xff0c;兼容主流…

工作紀實_63-Mac電腦使用brew安裝軟件

最近在接觸kafka&#xff0c;想著在自己的電腦安裝一套環境&#xff0c;docker也能行&#xff0c;但是還是想裝一些原生的軟件試試看&#xff0c;因此便想著整理一下brew的命令&#xff0c;這命令確實是方便&#xff0c;不需要下載tar包亂八七糟的東西&#xff0c;一鍵安裝 bre…

Python語法系列博客 · 第8期[特殊字符] Lambda函數與高階函數:函數式編程初體驗

上一期小練習解答&#xff08;第7期回顧&#xff09; ? 練習1&#xff1a;找出1~100中能被3或5整除的數 result [x for x in range(1, 101) if x % 3 0 or x % 5 0]? 練習2&#xff1a;生成字符串長度字典 words ["apple", "banana", "grape…

Redis--主從復制

目錄 一、配置 1.1 建立復制 1.2 斷開復制 1.3 安全性 1.4 只讀 1.5 傳輸延遲 二、拓撲 2.1 一主一從結構 2.2 一主多從結構 2.3 樹形主從結構 在分布式系統中為了解決單點問題&#xff0c;通常會把數據復制多個副本部署到其他服務器&#xff0c;滿足故障恢 復和負載均衡等需求…

已注冊商標如何防止被不使用撤銷!

近年來已注冊商標被撤銷越來越多&#xff0c;不乏著名企業或機構&#xff0c;普推知產商標老楊看到前一陣看到央視和百度等申請的商標也被申請撤銷&#xff0c;連續三年不使用撤銷也是正常的商標流程。 已注冊商標被撤銷普推老楊看到案例主要是集中在一些早期申請注冊的好記的商…

解密大模型背后的秘密:訓練、優化與挑戰

解密大模型背后的秘密&#xff1a;訓練、優化與挑戰 在當今的人工智能領域&#xff0c;大模型&#xff08;Large Language Models, LLMs&#xff09;已經成為了一個不可忽視的存在。從自然語言處理到圖像生成&#xff0c;再到推薦系統&#xff0c;大模型以其強大的泛化能力和創…

App自動化測試流程方案與架構設計

App自動化測試流程方案與架構設計 一、核心流程設計 #mermaid-svg-kN4GmIvHb8MMT83M {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-kN4GmIvHb8MMT83M .error-icon{fill:#552222;}#mermaid-svg-kN4GmIvHb8MMT83M .e…

字節跳動發布視頻生成基礎大模型 Seaweed-7B

近日&#xff0c;字節跳動發布了其全新視頻生成基礎大模型 Seaweed-7B&#xff0c;該模型由字節 Seed 團隊開發&#xff0c;參數量僅為 70 億&#xff0c;在多個方面展現出卓越性能&#xff0c;為 AI 視頻生成領域帶來了新的突破。 功能特點 支持多種生成方式&#xff1a;Sea…

如何基于區塊鏈進行虛擬電廠運營平臺建設?

本項目旨在基于區塊鏈技術建設虛擬電廠運營平臺&#xff0c;以提升省內大用戶及工業企業和工業園區的需求響應能力&#xff0c;優化能源結構配置&#xff0c;并推動能源交易、需求響應和現貨交易等新型業態的發展。通過建設虛擬電廠&#xff0c;項目將實現工業企業及園區各供用…

LeetCode[459]重復的子字符串(KMP解法)

思路&#xff1a; 最近迷上了KMP算法&#xff0c;所以這道題也是來搞一下KMP算法&#xff0c;總所周知KMP是需要維護一個前綴表&#xff0c;KMP算法不是比較一個字符串包不包含另一個字符串的嗎&#xff0c;這個重復字符串的題也能用&#xff1f;貓爺&#xff1a;毋庸置疑&…

spring-batch批處理框架(2)

文章目錄 八、作業控制8.1 作業啟動8.1.1 SpringBoot 啟動8.1.2 Spring 單元測試啟動8.1.3 RESTful API 啟動 8.2 作業停止方案1&#xff1a;Step 步驟監聽器方式方案2&#xff1a;StepExecution停止標記 8.3 作業重啟8.3.1 禁止重啟8.3.2 限制重啟次數8.3.3 無限重啟 九、Item…

uniapp的通用頁面及組件基本封裝

1.基本布局頁面 適用于自定義Navbar頭部 <template><view :style"{ background : param.bgColor , height: 100% }"><block v-if"param.noHead"><slot name"head"></slot></block><block v-if"!p…

基于MTF的1D-2D-CNN-GRU-Attention時序圖像多模態融合的故障識別,適合研究學習(Matlab完整源碼和數據),附模型研究報告

基于MTF的1D-2D-CNN-GRU-Attention時序圖像多模態融合的故障識別&#xff0c;適合研究學習&#xff08;Matlab完整源碼和數據&#xff09;&#xff0c;附模型研究報告 目錄 基于MTF的1D-2D-CNN-GRU-Attention時序圖像多模態融合的故障識別&#xff0c;適合研究學習&#xff08;…

HTTP/1.1 隊頭堵塞問題

文章目錄 一、隊頭堵塞1、非管線化2、管線化 二、如何解決&#xff1f; 一、隊頭堵塞 1、非管線化 如圖&#xff0c;http 請求必須等到上一個請求響應后才能發送&#xff0c;后面的以此類推&#xff0c;由此可以看出&#xff0c;在一個 tcp 通道中&#xff0c;如果某個 http 請…

施磊老師基于muduo網絡庫的集群聊天服務器(二)

文章目錄 Cmake簡單介紹Cmake與MakefileCmake配置CmakeLists.txt 編寫完整cmake例子文件夾雜亂問題多級目錄Cmakevscode 極其推薦 的 cmake方式 Mysql環境與編程mysql簡單使用User表Friend表AllGroup表GroupUser表OfflineMessage表 集群聊天項目工程目錄創建網絡模塊代碼Chatse…

4.18---緩存相關問題(操作原子性,擊穿,穿透,雪崩,redis優勢)

為什么要用redis做一層緩存&#xff0c;相比直接查mysql有什么優勢&#xff1f; 首先介紹Mysql自帶緩存機制的問題&#xff1a; MySQL 的緩存機制存在一些限制和問題,它自身帶的緩存功能Query Cache只能緩存完全相同的查詢語句&#xff0c;對于稍有不同的查詢語句&#xff0c…

健康養生指南

在快節奏的現代生活中&#xff0c;健康養生成為人們關注的焦點。它不僅關乎身體的強健&#xff0c;更是提升生活質量、預防疾病的關鍵。掌握科學的養生方法&#xff0c;能讓我們在歲月流轉中始終保持活力。 飲食是健康養生的基礎。遵循 “均衡膳食” 原則&#xff0c;每日飲食需…

#去除知乎中“鹽選”付費故事

添加油猴腳本&#xff0c;去除知乎中“鹽選”付費故事 // UserScript // name 鹽選內容隱藏腳本 // namespace http://tampermonkey.net/ // version 0.2 // description 自動隱藏含有“鹽選專欄”或“鹽選”文字的回答卡片 // author YourName // mat…

如何防止接口被刷

目錄 &#x1f6e1;? 一、常見的防刷策略分類 &#x1f527; 二、技術實現細節 ? 1. 基于 IP 限流 ? 2. 給接口加驗證碼 ? 3. 使用 Token 限制接口訪問權限 ? 4. 給接口加冷卻時間&#xff08;驗證碼類經典&#xff09; ? 5. 使用滑動窗口限流算法&#xff08;更精…

github 項目遷移到 gitee

1. 查看遠程倉庫地址 git remote -v 2. 修改遠程倉庫地址 確保 origin 指向你的 Gitee 倉庫&#xff0c;如果不是&#xff0c;修改遠程地址。 git remote set-url origin https://gitee.com/***/project.git 3. 查看本地分支 git branch 4. 推送所有本地分支 git p…