設計模式(十三)抽象工廠模式

請直接看原文:
設計模式(十三)抽象工廠模式_抽象工廠模式告訴我們,要針對接口而不是實現進行設計。( )-CSDN博客

--------------------------------------------------------------------------------------------------------------------------------?

前言

此前講解過簡單工廠模式和工廠模式,這一篇我們來學習工廠系列的最后一個模式抽象工廠模式,建議在閱讀此文前,請先閱讀設計模式(四)簡單工廠模式、設計模式(十)工廠方法模式這兩篇文章。

抽象工廠模式定義

抽象工廠模式可以說是是工廠方法模式的升級版,當需要創建的產品有多個產品線(產品族)時使用抽象工廠模式是比較好的選擇。那什么是多個產品線呢?拿我們在設計模式(四)簡單工廠模式、設計模式(十)工廠方法模式中學習的生產電腦的例子來舉例,我們一直都是生產聯想和惠普的電腦,但是電腦也有多個產品線:臺式機、筆記本和平板等等,聯想和惠普都在生產這些不同產品線上的電腦,使用工廠方法模式已經滿足不了需求,這一篇文章我們就用抽象工廠模式來解決這一問題。

抽象工廠模式定義
為創建一組相關或者相互依賴的對象提供一個接口,而無需指定它們的具體類。

抽象工廠模式UML圖
這里寫圖片描述

在抽象工廠模式中有如下角色:
- AbstractFactory:抽象工廠,它聲明了用來創建不同產品的方法。
- ConcreteFactory:具體工廠,實現抽象工廠中定義的創建產品的方法。
- AbstractProduct:抽象產品,為每種產品聲明業務方法。比如上圖的AbstractProductA和 AbstractProductB。
- ConcreteProduct:具體產品,定義具體工廠生產的具體產品,并實現抽象產品中定義的業務方法。

抽象工廠模式簡單實現

聯想和惠普生產的電腦分為了兩個產品線,一個臺式機,一個是筆記本。為了解決增加產品線的問題,我們用抽象工廠模式來進行實現。

抽象產品
首先定義抽象產品類:

public abstract class DesktopComputer {public abstract void start();
}
public abstract class NotebookComputer {public abstract void start();
}

兩個抽象產品類分別為DesktopComputer和NotebookComputer ,用來定義兩個產品線:臺式機和筆記本。它們都定義了start方法,用來啟動電腦。
具體產品
具體產品為聯想和惠普旗下的臺式機和筆記本,如下所示。

public class LenovoDesktopComputer extends DesktopComputer {@Overridepublic void start() {System.out.println("聯想臺式電腦啟動");}
}public class HpDesktopComputer extends DesktopComputer {@Overridepublic void start() {System.out.println("惠普臺式電腦啟動");}
}public class LenovoNotebookComputer extends NotebookComputer {@Overridepublic void start() {System.out.println("聯想筆記本電腦啟動");}
}
public class HpNotebookComputer extends NotebookComputer {@Overridepublic void start() {System.out.println("惠普筆記本電腦啟動");}
}

抽象工廠
接著創建生產電腦的抽象工廠,如下所示,

public abstract class ComputerFactory {public abstract DesktopComputer createDesktopComputer();public abstract NotebookComputer createNotebookComputer();
}

定義了兩個方法,分別用來生產臺式電腦和筆記本電腦。

具體工廠
定義聯想和惠普工廠:

public class LenovoFactory extends ComputerFactory {@Overridepublic DesktopComputer createDesktopComputer() {return new LenovoDesktopComputer();}@Overridepublic NotebookComputer createNotebookComputer() {return new LenovoNotebookComputer();}
}public class HpFactory extends ComputerFactory {@Overridepublic DesktopComputer createDesktopComputer() {return new HpDesktopComputer();}@Overridepublic NotebookComputer createNotebookComputer() {return new HpNotebookComputer();}
}

聯想工廠和惠普工廠用來生產臺式機和筆記本這兩個不同產品線的電腦。

客戶端調用
最后編寫客戶端:

public class Client {public static void main(String[]args) {ComputerFactory lenocoFactory=new LenovoFactory();lenocoFactory.createDesktopComputer().start();lenocoFactory.createNotebookComputer().start();ComputerFactory hpFactory=new HpFactory();hpFactory.createDesktopComputer().start();hpFactory.createNotebookComputer().start();}
}

分別用LenovoFactory和HpFactory生產臺式和筆記本電腦,并調用start方法啟動它們。
運行結果為:
聯想臺式電腦啟動
聯想筆記本電腦啟動
惠普臺式電腦啟動
惠普筆記本電腦啟動

接下來給出這個例子的UML圖,更便于理解,如下所示。
這里寫圖片描述

抽象工廠模式的優缺點

優點
具體類的創建實例過程與客戶端分離,客戶端通過工廠的抽象接口操縱實例,客戶端并不知道具體的實現是誰。

缺點
如果增加新的產品族則也需要修改抽象工廠和所有的具體工廠。

抽象工廠模式的使用場景
  • 一個系統不依賴于產品線實例如何被創建、組合和表達的細節。
  • 系統中有多于一個的產品線,而每次只使用其中某一產品線。
  • 一個產品線(或是一組沒有任何關系的對象)擁有相同的約束。

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

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

相關文章

系統架構設計文檔模版

XX 系統架構設計方案 修訂記錄 日期 版本號 修訂說明 修訂人 審核人 1、概述... 5 1.1.業務背景... 5 1.2.系統總體描述... 5 1.3.系統邊界圖... 5 1.4.名詞和縮略語... 5 1.…

live555源碼學習(1)

1 基礎組件 live項目主要包含了四個基礎庫、程序入口類(mediaServer)和測試程序(testProgs)。四個基礎庫是UsageEnvironment、BasicUsageEnvironment、groupsock和liveMedia UsageEnvironment 抽象了兩個類UsageEnvironment和T…

力扣hot5---雙指針

題目: 解決方案:雙指針 指針 i 指向最左側,指針 j 指向最右側。此時在寬度上達到了最大值,那么哪個柱子更矮,哪個柱子向內部移動,知道 i 與 j 相遇。為什么呢? 如果哪個哪個柱子更矮&#xff0c…

代碼隨想錄算法訓練營第四十一天|198.打家劫舍,213.打家劫舍II,337.打家劫舍III

系列文章目錄 代碼隨想錄算法訓練營第一天|數組理論基礎,704. 二分查找,27. 移除元素 代碼隨想錄算法訓練營第二天|977.有序數組的平方 ,209.長度最小的子數組 ,59.螺旋矩陣II 代碼隨想錄算法訓練營第三天|鏈表理論基礎&#xff…

Node.js基礎---模塊化

基本概念 模塊化 模塊化是指解決一個復雜問題時,自上向下逐層把系統劃分成若干模塊的過程,對于整個系統來說,模塊是可組合,分解和更換的單元 遵守固定規則,把大文件拆分成獨立并互相依賴的多個小模塊 好處&#xff1a…

【計算機畢業設計】208基于SSM的在線教育網站

🙊作者簡介:擁有多年開發工作經驗,分享技術代碼幫助學生學習,獨立完成自己的項目或者畢業設計。 代碼可以私聊博主獲取。🌹贈送計算機畢業設計600個選題excel文件,幫助大學選題。贈送開題報告模板&#xff…

OLLAMA:如何像專業人士一樣運行本地語言模型

原文 https://cheatsheet.md/llm-leaderboard/ollama.en簡介:揭示 OLLAMA 對本地語言模型的強大功能 您是否曾經發現自己陷入了基于云的語言模型網絡中,渴望獲得更本地化、更具成本效益的解決方案?好吧,您的搜索到此結束。歡迎來…

逆向案例四、進階,爬取精靈數據咨詢前五十頁數據

python代碼示例: import csv import execjs import requests f open(精靈數據.csv,w,encodingutf-8,newline) csv_writer csv.DictWriter(f,fieldnames[標題,發布時間,新聞來源,詳情頁鏈接,轉自,點擊量,新聞作者,發布時間小時,]) csv_writer.writeheader() data [] for pa…

【Ansys Fluent Web 】全新用戶界面支持訪問大規模多GPU CFD仿真

基于Web的技術將釋放云計算的強大功能,加速CFD仿真,從而減少對硬件資源的依賴。 主要亮點 ? 使用Ansys Fluent Web用戶界面?(UI),用戶可通過任何設備與云端運行的仿真進行遠程交互 ? 該界面通過利用多GPU和云計算功…

理解python3中的回調函數

百度百科說:回調函數就是一個通過函數指針調用的函數。如果你把函數的指針(地址)作為參數傳遞給另一個函數,當這個指針被用來調用其所指向的函數時,我們就說這是回調函數。回調函數不是由該函數的實現方直接調用&#…

Sqli-labs靶場第13關詳解[Sqli-labs-less-13]

Sqli-labs-Less-13 #手工注入 post傳參了 根據題目看,像一個登錄頁面,嘗試使用布爾型盲注測試能否登錄網站 1. Username輸入a 測試是否會有報錯,burp抓包 報錯:syntax to use near a) and password() LIMIT 0,1 at line 1 分…

[python] `json.dumps()` TypeError: Object of type set is not JSON serializable

在Python中,當你嘗試將一個集合(set)類型的對象轉換為JSON格式時,可能會遇到“TypeError: Object of type set is not JSON serializable”的錯誤。這是因為標準的JSON格式不支持Python中的集合類型,JSON格式支持的數據…

【04】C語言括號匹配問題

歡迎來到土土的博客~🥳🥳🌹🌹🌹 💥個人主頁:大耳朵土土垚的博客 💥 所屬專欄:C語言系列函數實現 題目描述: 給定一個只包括 ‘(’,‘)’&#xf…

加密隧道技術

在現在的互聯網上傳輸數據,首要考慮的就是安全。這關乎到你的隱私,個人信息,財產安全等等重大問題。如果你的程序本身傳輸的信息沒有加密,也可以通過其他輔助方式讓你的通信加密。一些工具的就是為了解決這樣的場景的,…

之前續寫抖音開發者接入字節小游戲的緩存一下,現在說一下在 Windows 或者 Mac 如何用終端更換路徑?

window: 比方說你的 window 目錄下是這個路徑: 第一:E:\project\Q1\trunk\client\src,然后你想切換到下一個路徑的話,你可以這樣子操作: 第二:E:\project\Q1\trunk\client\src> cd .\usersetting 然后回車,這里不會計較大小寫 第三:你就可以在這個目錄下執行你的腳本:E:…

學習大數據,所必需的java基礎(7)

文章目錄 File類File 的靜態成員File的構造方法File的獲取方法相對路徑和絕對路徑File的創建方法File類中的刪除方法File的遍歷方法 字節流IO流介紹以及輸入輸出以及流向的介紹IO流的流向IO流分類IO流分類 OutputStream中的子類FileOutoutStream的介紹以及方法的簡單介紹InputS…

服務器中如何檢查端口是否開放

有多種方法可以檢測服務器端口是否開放。以下是一些常用的方法: 1. Telnet 命令: 使用 Telnet 命令來測試端口的可達性。在命令提示符或終端中執行以下命令: telnet your_server_ip your_port_number 如果連接成功,表示端口是…

C++ //練習 10.22 重寫統計長度小于等于6 的單詞數量的程序,使用函數代替lambda。

C Primer(第5版) 練習 10.22 練習 10.22 重寫統計長度小于等于6 的單詞數量的程序,使用函數代替lambda。 環境:Linux Ubuntu(云服務器) 工具:vim 代碼塊 /********************************…

PDF標準詳解(二)——PDF 對象

上一篇文章我們介紹了一個PDF文檔應該包含的最基本的結構,并且手寫了一個最簡單的 “Hello World” 的PDF文檔。后面我們介紹新的PDF標準給出示例時將以這個文檔為基礎,而不再給出完整的文檔示例,小伙伴想自己測試可以根據上一節的文檔來進行…

分布式ID選型對比(3)

redis自增 一, 引入依賴: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><version>2.6.5</version> </dependency> 二, 配置信息: spring:redis:# 地…