設計模式筆記_創建型_工廠模式

1. 工廠模式簡介

工廠模式是一種創建型設計模式,主要用于創建對象實例。?它通過定義一個接口或抽象類來創建對象,而不是直接實例化具體類,從而將對象的創建過程與使用過程分離。

工廠模式通常分為兩種類型:

  • 簡單工廠模式(Simple Factory): 這種模式并不是GoF設計模式之一,但在實際應用中非常常見。 簡單工廠模式通過一個工廠類來負責創建對象,根據傳入的參數的不同,返回不同類型的實例。

  • 工廠方法模式(Factory Method): 工廠方法模式定義一個創建對象的接口,但由子類決定實例化哪個類。這樣,工廠方法模式讓類的實例化推遲到子類中進行。

2.代碼演示

假設我們有一個咖啡店,咖啡店可以制作不同種類的咖啡,如美式咖啡和拿鐵咖啡。我們將分別使用簡單工廠模式工廠方法模式來演示創建不同的咖啡。

2.1 共用代碼

coffee相關的代碼是兩種工廠模式共用的,如下:

/** 抽象的Coffee頂層類 */
public abstract class Coffee {public abstract void prepare();
}/** 美式咖啡 */
public class AmericanoCoffee extends Coffee {@Overridepublic void prepare() {System.out.println(" prepare AmericanoCoffee");}
}/** 拿鐵咖啡 */
public class LatteCoffee extends Coffee {@Overridepublic void prepare() {System.out.println(" prepare LatteCoffee");}
}

2.2 簡單工廠模式

/** * 簡單工廠模式(Simple Factory):* 簡單工廠模式通過一個工廠類來負責創建對象,根據傳入的參數的不同,返回不同類型的實例。* 這種模式并不是GoF設計模式之一,但在實際應用中非常常見。
*/
public class CoffeeSimpleFactory {private static final String AMERICANO = "Americano";private static final String LATTE = "Latte";public static Coffee createCoffee(String coffeeType) {if (AMERICANO.equals(coffeeType)) {return new AmericanoCoffee();}if (LATTE.equals(coffeeType)) {return new LatteCoffee();}return null;}
}

簡單工廠模式對應的類圖:

2.2 工廠方法模式

/*** 工廠方法模式(Factory Method):* 定義一個創建對象的接口, 但由子類決定實例化哪個類, 工廠方法模式讓類的實例化推遲到子類中進行。*/
public interface CoffeeFactory {/*** 創建咖啡** @return Coffee*/Coffee createCoffee();
}/** 美式咖啡工廠 */
public class AmericanoCoffeeFactory implements CoffeeFactory {@Overridepublic Coffee createCoffee() {return new AmericanoCoffee();}
}/** 拿鐵咖啡工廠 */
public class LatteCoffeeFactory implements CoffeeFactory {@Overridepublic Coffee createCoffee() {return new LatteCoffee();}
}//--------------------------------------------------------/** 使用咖啡工廠創建咖啡 */
public class CoffeeMainProcess {private static final String AMERICANO = "Americano";private static final String LATTE = "Latte";private static final Map<String, CoffeeFactory> CACHED_COFFEE_FACTORY = new ConcurrentHashMap<>(16);static {CACHED_COFFEE_FACTORY.put(AMERICANO, new AmericanoCoffeeFactory());CACHED_COFFEE_FACTORY.put(LATTE, new LatteCoffeeFactory());}public static Coffee createCoffee(String coffeeType) {if (StringUtils.isEmpty(coffeeType) || !CACHED_COFFEE_FACTORY.containsKey(coffeeType)) {return null;}CoffeeFactory coffeeFactory = CACHED_COFFEE_FACTORY.get(coffeeType);return coffeeFactory.createCoffee();}
}

工廠方法模式對應的類圖:

工廠方法模式的優點:

  • 解耦:將對象的創建與使用分離,降低了代碼的耦合度。
  • 擴展性:新增產品時,只需添加對應的具體產品類和具體工廠類,符合開閉原則。

工廠方法模式的缺點:

  • 復雜性增加:需要為每一個產品創建一個具體工廠類,增加了系統的復雜度。
  • 類數量增多:可能導致類數量增多,增加維護成本。

工廠方法模式適合場景:

  • 在需要靈活創建對象并且對象類型較多的場景中使用。

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

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

相關文章

2025.6.16總結

工作&#xff1a;今天閉環了個遺留問題。在做專項評估時寫得太簡單&#xff0c;這讓測試經理質疑你的測試質量。如果換位思考&#xff0c;你是測試經理&#xff0c;你該怎么去把握風險和保證產品的質量&#xff0c;就知道寫得太簡單&#xff0c;沒有可信度。 找開發看了下后臺…

記錄:安裝VMware、Ubuntu、ROS2

安裝了VMware&#xff0c;就能夠在Windows系統裝安裝Ubuntu&#xff0c;使用Linux系統。安裝了Ubuntu&#xff0c;就能在里面安裝ROS2&#xff0c;之后寫代碼控制機器人兒。 安裝VMware 我安裝的是16 pro【具體是vmware16.2.4】&#xff0c;下載網站&#xff1a;VMware Works…

將后端數據轉換為docx文件

使用docx npm install docx 按照注釋處理數據并轉換為對應的bolb數據流 <template><Button type"primary" click"handleDocxCreate">{{buttonTitle || "報告生成"}}</Button> </template><script> import {Doc…

數據結構排序算法合集

快排 private static void quickSort(int[] ret) { quick(ret,0,ret.length-1); } private static void quick(int[] ret, int left, int right) { if(left>right) 記一下這里是大于等于 return; int pivot partition(ret,left,right); quick(ret…

【算法筆記】紅黑樹插入操作

紅黑樹插入與調整詳解 一、紅黑樹的五大性質 紅黑樹是一種自平衡的二叉搜索樹&#xff08;BST&#xff09;&#xff0c;其核心特性如下&#xff1a; 顏色屬性&#xff1a;每個節點非紅即黑根屬性&#xff1a;根節點必須為黑色葉子屬性&#xff1a;所有的 NIL 葉子節點都是黑…

認知計算革命:從算法創新到產業落地的AI專業核心應用全景

??一、自動化機器學習&#xff08;AutoML&#xff09;?? ??技術機理與產業實踐深度剖析?? ??神經網絡架構搜索&#xff08;NAS&#xff09;?? 強化學習方案&#xff1a;Google Brain的NASNet采用策略梯度優化卷積單元進化算法方案&#xff1a;DeepMind的AmeobaNe…

篇章十 論壇系統——業務開發——板塊和帖子

目錄 1.板塊 1.1 思路 1.2 實現邏輯 1.3 參數要求 1.4 實現步驟 1.Mapper.xml 2.Mapper.java 3.Service接口 4.Service實現 5.單元測試 6.Controller 7.測試API 8.前后端交互 2.帖子 1.1思路?編輯 1.2 參數要求 ?編輯 1.3 實現步驟 1.Mapper.xml 2.Mapper…

React Native 上線前的準備與企業實戰經驗總結

上線前的準備與企業實戰經驗總結 關鍵要點 熱更新簡化部署&#xff1a;CodePush 和 Expo OTA 允許快速推送 JavaScript 和資源更新&#xff0c;繞過應用商店審核&#xff0c;適合修復 Bug 或小規模功能迭代。監控與分析提升質量&#xff1a;Sentry 提供實時錯誤跟蹤&#xff…

【AI時代速通QT】第一節:C++ Qt 簡介與環境安裝

目錄 前言 一、為什么是 Qt&#xff1f;—— C 開發者的必備技能 二、Qt 的核心魅力&#xff1a;不止于跨平臺 2.1 優雅之一&#xff1a;代碼隔離&#xff0c;清晰明了 2.2 優雅之二&#xff1a;信號與槽&#xff08;Signal & Slot&#xff09;機制 2.3 優雅之三&…

pandas學習筆記

前言 總結才是知識&#xff0c;作者習慣不好&#xff0c;不會總結&#xff0c;導致函數一旦不使用就會忘記怎么使用&#xff0c;特此寫了本文&#xff0c;用于給自己一個復習的資料. 提示&#xff1a;如果你是小白&#xff0c;每個代碼請自己敲打。 一 pandas的介紹 Pandas is…

算法題(力扣每日一題)—改變一個整數能得到的最大差值

給你一個整數 num 。你可以對它進行以下步驟共計 兩次&#xff1a; 選擇一個數字 x (0 < x < 9). 選擇另一個數字 y (0 < y < 9) 。 數字 y 可以等于 x 。 將 num中所有出現 x 的數位都用 y 替換。 令兩次對 num 的操作得到的結果分別為 a 和 b 。 請你返回 a 和 b…

Kubernetes筆記

1.簡介 Kubernetes的本質是一組服務器集群&#xff0c;它可以在集群的每個節點上運行特定的程序&#xff0c;來對節點中的容器進行管理。目的是實現資源管理的自動化&#xff0c;主要提供了如下的主要功能&#xff1a; 自我修復&#xff1a;一旦某一個容器崩潰&#xff0c;能夠…

Flutter——數據庫Drift開發詳細教程(八)

目錄 自定義 SQL 類型定義類型使用自定義類型在 Dart 中在 SQL 中 方言意識支持的 SQLite 擴展json1fts5地緣壟斷 自定義 SQL 類型 Drift 的核心庫主要以 SQLite3 為目標平臺編寫。這體現在Drift 開箱即用的SQL 類型上——這些類型由 SQLite3 支持&#xff0c;并新增了一些由 …

安卓遠控工具 CRaxsRat v7.6 安裝與使用教程(僅供合法測試學習)

在當今的信息安全領域&#xff0c;移動設備已成為重點關注對象。本文將介紹一款用于遠程管理與教學研究的工具 —— CRaxsRat v7.6&#xff0c;并詳細講解其安裝與使用流程。本教程僅供網絡安全愛好者在合法授權環境下學習使用&#xff0c;嚴禁任何非法用途。 &#x1f50d; 一…

容器的本質是進程

前言 Linux 容器的本質&#xff0c;是一個被隔離和限制的進程。 與虛擬機不同&#xff0c;容器無需虛擬化一個完整的操作系統&#xff0c;所以它比虛擬機更輕量級&#xff0c;效率也更高。 Linux 容器通過 namespaces 技術來隔離容器的視圖&#xff0c;使得容器進程只能看到…

LeetCode 第75題:顏色分類

給定一個包含紅色、白色和藍色、共n個元素的數組nums&#xff0c;原地對它們進行排序&#xff0c;使得相同顏色的元素相鄰&#xff0c;并按照紅色、白色、藍色順序排序。 使用整數0、1和2分布表示紅色、白色和藍色。 必須在不使用庫內置sort函數的情況下解決這個問題。 示例1&a…

PHP基礎-函數

函數是一段可重復使用的代碼塊&#xff0c;可以將一系列操作封裝起來&#xff0c;使代碼更加模塊化、可維護和可重用&#xff0c;來大大節省我們的開發時間和代碼量&#xff0c;提高編程效率。在PHP中你可以使用&#xff1a; 內置函數&#xff08;如 strlen()、array_merge()&a…

【FastAPI高級實戰】結合查詢參數與SQLModel Joins實現高效多表查詢(分頁、過濾、計數)

想象一下&#xff0c;你正在開發一個超酷的Web應用&#xff0c;比如一個博客平臺或者一個在線商店。你的API不僅要能把數據&#xff08;比如文章列表、商品信息&#xff09;展示給用戶&#xff0c;更要聰明到能理解用戶的各種“小心思”&#xff1a;用戶可能想看最新的文章、搜…

華為OD-2024年E卷-通過軟盤拷貝文件[200分] -- python

問題描述&#xff1a; 有一名科學家想要從一臺古董電腦中拷貝文件到自己的電腦中加以研究。但此電腦除了有一個3.5寸軟盤驅動器以外&#xff0c;沒有任何手段可以將文件持貝出來&#xff0c;而且只有一張軟盤可以使用。因此這一張軟盤是唯一可以用來拷貝文件的載體。科學家想要…

Keepalived 高可用,nginx + keepalived , lvs + keepalived、 數據庫+keepalived

keepalived 官網 Keepalived 可以用來防止服務器單點故障的發生 # 原理 是基于VRRP協議實現的&#xff0c;當backup收不到vrrp包時&#xff0c;就認為master宕機了&#xff0c;這時就需要根據VRRP的優先級來選舉一個backup 當master&#xff0c;就實現服務的HA&#xff08;高…