設計模式從入門到精通之(一)工廠模式

工廠模式:為每個工廠找到"生意經"

在現實生活中,我們隨處可見"工廠"的影子,比如汽車工廠生產汽車,食品工廠生產食品。但你有沒有想過,為什么我們需要工廠?如果沒有工廠,我們自己能不能搞定這些生產?今天,我們就用現實中的例子來引入軟件設計中的工廠模式

1. 什么是工廠模式?

工廠模式(Factory Pattern)是一種創建型設計模式,它通過為對象的創建提供一種統一的接口,來隱藏實例化的具體邏輯。簡單來說,工廠模式就像一臺機器,它為你定制化地生產出想要的東西,而不需要你自己動手去搗鼓具體的制作過程。

在代碼世界里,工廠模式能夠幫助我們解決"簡單對象創建"變成"復雜耦合代碼"的問題,減少維護難度。

2. 用現實中的故事引出工廠模式

假設你是一名咖啡愛好者,每天早晨都需要喝一杯咖啡來提神。家里有各種原材料,比如咖啡豆、牛奶、糖等等。但是如果讓你每天一大早起來,自己磨豆、煮咖啡、打奶泡,是不是感覺太麻煩?如果有一家咖啡店幫你制作出各種類型的咖啡,比如美式、拿鐵、卡布奇諾,你只需要說出你想喝的咖啡名稱就行,豈不是省時省力?

這家咖啡店就是一個工廠,它屏蔽了制作過程的復雜性,讓你通過簡單的請求(咖啡名稱),得到想要的結果(咖啡)。

3. 工廠模式的代碼實現

我們用代碼來模擬這個場景,看看如何用工廠模式來制作咖啡。

3.1 咖啡類

每種咖啡都有自己的特點,我們用不同的類來表示。

// 定義咖啡的抽象類
abstract class Coffee {public abstract String getName();public void prepare() {System.out.println("Preparing ingredients for " + getName());}
}// 美式咖啡
class AmericanCoffee extends Coffee {@Overridepublic String getName() {return "American Coffee";}
}// 拿鐵咖啡
class LatteCoffee extends Coffee {@Overridepublic String getName() {return "Latte Coffee";}
}

3.2 咖啡工廠

為了屏蔽咖啡的具體制作細節,我們創建一個咖啡工廠。

class CoffeeFactory {public static Coffee createCoffee(String type) {if ("American".equalsIgnoreCase(type)) {return new AmericanCoffee();} else if ("Latte".equalsIgnoreCase(type)) {return new LatteCoffee();} else {throw new IllegalArgumentException("Unknown coffee type: " + type);}}
}

3.3 客戶端代碼

客戶端只需要和工廠交互,就可以獲取不同種類的咖啡,而不用關心咖啡是怎么制作的。

public class CoffeeShop {public static void main(String[] args) {Coffee american = CoffeeFactory.createCoffee("American");american.prepare();Coffee latte = CoffeeFactory.createCoffee("Latte");latte.prepare();}
}

運行結果:

Preparing ingredients for American Coffee
Preparing ingredients for Latte Coffee

4. 工廠模式的優缺點

優點:

    1. 解耦:客戶端與具體產品類解耦,新增產品時只需要修改工廠類。
    1. 高內聚:對象創建的邏輯集中在工廠中,代碼更清晰。

缺點:

    1. 工廠類的職責可能會變得過重,容易違背單一職責原則。
    1. 每增加一種新產品,都需要修改工廠類代碼,違反開閉原則(這可以通過工廠方法模式改進)。

5. 總結

工廠模式是最常用的設計模式之一,它的核心思想就是將創建對象的邏輯集中管理,減少代碼中的重復和耦合。通過咖啡店的例子,我們可以更容易理解工廠模式的用途。

在未來的專欄中,我們還會講解其他設計模式,比如單例模式可以確保一杯咖啡只做一份,而裝飾器模式可以為你的咖啡添加額外的配料。每一種設計模式,就像現實世界中的一套工具,幫助你更高效地構建程序。

思考問題:
如果你想擴展工廠模式,比如支持更多種類的咖啡(比如卡布奇諾),你會如何設計?歡迎在評論區分享你的看法!

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

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

相關文章

談談你對vue這種框架理解

發現寶藏 前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。【寶藏入口】。 Vue.js 是一個漸進式的前端 JavaScript 框架,旨在通過提供易于理解、上手簡單且功能強大的工具來構建現代化的 Web …

使用html2canvas實現前端截圖

一、主要功能 網頁截圖:html2canvas通過讀取DOM結構和元素的CSS樣式,在客戶端生成圖像,不依賴于服務端的渲染。它可以將指定的DOM元素渲染為畫布(canvas),并生成圖像。多種輸出格式:生成的圖像…

微信小程序橫屏頁面跳轉后,自定義navbar樣式跑了?

文章目錄 問題原因:解決方案: 今天剛遇到的問題,橫屏的頁面完成操作后跳轉頁面后,自定義的tabbar樣式亂了,跑到最頂了,真機調試后發現navbar跑到手機狀態欄了,它正常應該跟右邊膠囊一行。 知道問…

Vivado ILA數據導出MATLAB分析

目錄 ILA數據導出 分析方式一 分析方式二 有時候在系統調試時,數據在VIVADO窗口獲取的信息有限,可結合MATLAB對已捕獲的數據進行分析處理 ILA數據導出 選擇信號,單擊右鍵后,會有export ILA DATA選項,將其保存成CS…

《探索形象克隆:科技與未來的奇妙融合》

目錄 一、什么是形象克隆 二、形象克隆的技術原理 三、形象克隆的發展現狀 四、形象克隆的未來趨勢 五、形象克隆的應用場景 六、形象克隆簡單代碼案例 Python 實現數字人形象克隆 Scratch 實現角色克隆效果(以貓為例) JavaScript 實現 Scratc…

MATLAB深度學習(七)——ResNet殘差網絡

一、ResNet網絡 ResNet是深度殘差網絡的簡稱。其核心思想就是在,每兩個網絡層之間加入一個殘差連接,緩解深層網絡中的梯度消失問題 二、殘差結構 在多層神經網絡模型里,設想一個包含諾干層自網絡,子網絡的函數用H(x)來表示&#x…

前端入門之VUE--vue組件化編程

前言 VUE是前端用的最多的框架;這篇文章是本人大一上學習前端的筆記;歡迎點贊 收藏 關注,本人將會持續更新。 文章目錄 2、Vue組件化編程2.1、組件2.2、基本使用2.2.1、VueComponent 2、Vue組件化編程 2.1、組件 組件:用來實現…

設計模式-裝飾器模式(結構型)與責任鏈模式(行為型)對比,以及鏈式設計

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 文章目錄 前言1.裝飾器模式1.1概念1.2作用1.3應用場景1.4特點1.5類與對象關系1.6實現 2責任鏈模式2.1概念2.2作用2.3應用場景2.4特點2.5類與對象關系2.6實現 3.對比總結 前言…

交叉熵損失函數(Cross-Entropy Loss)

原理 交叉熵損失函數是深度學習中分類問題常用的損失函數,特別適用于多分類問題。它通過度量預測分布與真實分布之間的差異,來衡量模型輸出的準確性。 交叉熵的數學公式 交叉熵的定義如下: C r o s s E n t r o y L o s s ? ∑ i 1 N …

操作系統:死鎖與饑餓

目錄 死鎖概念 饑餓與餓死概念 饑餓和死鎖對比 死鎖類型 死鎖條件(Coffman條件) 死鎖恢復方法 死鎖避免 安全狀態與安全進程序列: 銀行家算法: 死鎖檢測時機(了解): 死鎖檢測 死鎖案…

Prisoner’s Dilemma

囚徒困境博弈論解析 什么是囚徒困境? 囚徒困境(Prisoner’s Dilemma)是博弈論中的一個經典模型,用來分析兩名玩家在非合作環境下的決策行為。 其核心在于玩家既可以選擇合作也可以選擇背叛,而最終的結果取決于雙方的…

RPO: Read-only Prompt Optimization for Vision-Language Few-shot Learning

文章匯總 想解決的問題對CoOp的改進CoCoOp盡管提升了性能,但卻增加了方差(模型的準確率波動性較大)。 模型的框架一眼看去,跟maple很像(maple跟這篇文章都是2023年發表的),但maple的視覺提示是由文本提示經過全連接轉換而來的,而這里是文本提示和視覺提示是獨立的。另外m…

『MySQL 實戰 45 講』24 - MySQL是怎么保證主備一致的?

MySQL是怎么保證主備一致的? MySQL 主備的基本原理 基本的主備切換流程 狀態 1:客戶端的讀寫都直接訪問節點 A,而節點 B 是 A 的備庫狀態 2:切換時,讀寫訪問的都是節點 B,而節點 A 是 B 的備庫注意&…

自薦一部IT方案架構師回憶錄

作者本人畢業于一個不知名大專院校,所讀專業計算機科學技術。2009年開始IT職業生涯,至今工作15年。擅長TSQL/Shell/linux等技術,曾經就職于超萬人大型集團、國內頂級云廠商、央國企公司。參與過運營商大數據平臺、大型智慧城市ICT、云計算、人…

python數據分析之爬蟲基礎:selenium詳細講解

目錄 1、selenium介紹 2、selenium的作用: 3、配置瀏覽器驅動環境及selenium安裝 4、selenium基本語法 4.1、selenium元素的定位 4.2、selenium元素的信息 4.3、selenium元素的交互 5、Phantomjs介紹 6、chrome handless模式 1、selenium介紹 (1…

【數據結構——查找】順序查找(頭歌實踐教學平臺習題)【合集】

目錄😋 任務描述 相關知識 測試說明 我的通關代碼: 測試結果: 任務描述 本關任務:實現順序查找的算法。 相關知識 為了完成本關任務,你需要掌握:1.根據輸入數據建立順序表,2.順序表的輸出,…

光伏電站建設成本利潤估算

?截至2024年9月底,全國光伏發電裝機容量達到7.7億千瓦,同比增長48.4%。其中集中式光伏4.3億千瓦,分布式光伏3.4億千瓦。2024年前三季度,全國光伏發電量6359億千瓦時,同比增長45.5%。全國光伏發電利用率97.2%,同比下降1.1個百分點.早在今年2月份,中國光伏行業協會名譽理…

create-react-app react19 搭建項目報錯

報錯截圖 此時運行會報錯: 解決方法: 1.根據提示安裝依賴法 執行npm i web-vitals然后重新允許 2.刪除文件法 在index.js中刪除對報錯文件的引入,刪除報錯文件

scala的集合性能2

可變集合\n可變集合允許在原地修改數據,適合需要頻繁更新的場景。Scala 的可變集合包括 ArrayBuffer、HashSet和HashMap。 1. ArrayBuffer\nArrayBuffer 是一個可變的動態數組,提供高效的隨機訪問和添加操作。 import scala.collection.mutable.ArrayB…

【Ubuntu】腳本自動化控制終端填充

1.sh腳本文件控制終端寫入命令 在SLAM算法中,每次啟動vins都需要起很多終端,盡管使用了超級終端Terminator可以終端內劃分看起來更加便捷,但是每次起算法的命令還是要自己輸入,已經被麻煩了兩年了,今天突然想寫寫一個…