設計模式-三大工廠

工廠模式有三種,分別是簡單工廠模式、工廠方法模式、抽象工廠模式。三種模式從前到后越來越抽象,也更具有一般性。

設計模式

優點

缺點

簡單工廠

1.實現了對責任的分割,它提供了專門的工廠類用于創建對象。

1.違背了開閉原則。

2.使用了靜態工廠方法,靜態方法不能被繼承和重寫。

工廠方法

1.避免創建者與具體的產品邏輯耦合 。

2.滿?單?職責,每?個業務邏輯實現都在所屬??的類中完成 。

3.滿?開閉原則,?需更改使?調??就可以在程序中引?新的產品類型

1.如果存在非常多的產品類型,實現的子類就會極速擴張。

抽象工廠

1.滿足了單一職責、開閉原則、解耦等優點。

1.隨著業務的不斷拓展,可能會造成類實現上的復雜度。

簡單工廠

一個工廠創建所有具體產品。對于增加新的產品,主要是新增產品,就要修改工廠類。符合單一職責原則。不符合開放-封閉原則

// 假設 Animal 是一個接口或抽象類
// Tiger 和 Cat 是實現了 Animal 接口的類// 定義 Animal 接口/抽象類
interface Animal {// 動物通用的方法(如果需要)
}// 具體的 Tiger 實現
class Tiger implements Animal {// 老虎的具體實現
}// 具體的 Cat 實現
class Cat implements Animal {// 貓的具體實現
}class AnimalFactory {// 定義 AnimalType 枚舉public enum AnimalType {TIGER, // 老虎類型CAT    // 貓類型}// 靜態方法,用于創建動物public static Animal createAnimal(AnimalType type) {if (AnimalType.TIGER == type) {return new Tiger(); // 如果是老虎類型,則創建 Tiger 對象} else if (AnimalType.CAT == type) {return new Cat();   // 如果是貓類型,則創建 Cat 對象}return null; // 如果類型不匹配,則返回 null (或者可以拋出 IllegalArgumentException 異常)}// 示例用法(可選,用于測試)public static void main(String[] args) {// 通過工廠創建老虎Animal tiger = AnimalFactory.createAnimal(AnimalType.TIGER);System.out.println("創建了動物: " + tiger.getClass().getSimpleName());// 通過工廠創建貓Animal cat = AnimalFactory.createAnimal(AnimalType.CAT);System.out.println("創建了動物: " + cat.getClass().getSimpleName());// 嘗試創建未知類型的動物(會返回 null)Animal unknown = AnimalFactory.createAnimal(null); // 傳入 null 僅作演示,實際應用中應避免if (unknown == null) {System.out.println("未知類型的動物無法創建。");}}
}

優點:

1.實現了對責任的分割,它提供了專門的工廠類用于創建對象。

缺點:

1.違背了開閉原則。

2.使用了靜態工廠方法,靜態方法不能被繼承和重寫。

工廠方法

一個工廠方法只創建一個具體產品。支持增加任意產品,新增產品時不需要更改已有的工廠,需要增加該產品對應的工廠。符合單一職責原則、符合開放-封閉原則。但是引入了復雜性。

// 動物基類
abstract class Animal {// 可以在這里定義動物共有的方法和屬性
}// 具體動物類 - 貓
class Cat extends Animal {public Cat() {System.out.println("創建了一只貓");}
}// 具體動物類 - 老虎
class Tiger extends Animal {public Tiger() {System.out.println("創建了一只老虎");}
}// 抽象工廠接口
interface AnimalFactory {Animal createAnimal();
}// 貓工廠實現
class CatFactory implements AnimalFactory {@Overridepublic Animal createAnimal() {return new Cat();}
}// 老虎工廠實現
class TigerFactory implements AnimalFactory {@Overridepublic Animal createAnimal() {return new Tiger();}
}// 使用示例
public class FactoryExample {public static void main(String[] args) {// 創建貓工廠并生產貓AnimalFactory catFactory = new CatFactory();Animal cat = catFactory.createAnimal();  // 輸出: 創建了一只貓// 創建老虎工廠并生產老虎AnimalFactory tigerFactory = new TigerFactory();Animal tiger = tigerFactory.createAnimal();  // 輸出: 創建了一只老虎}
}

優點:

1.避免創建者與具體的產品邏輯耦合 。

2.滿?單?職責,每?個業務邏輯實現都在所屬??的類中完成 。

3.滿?開閉原則,?需更改使?調??就可以在程序中引?新的產品類型

缺點:

1.如果存在非常多的產品類型,實現的子類就會極速擴張。

抽象工廠

一個工廠方法只創建一類具體產品。增加新產品時,需要修改工廠,增加產品族時,需要增加工廠。符合單一職責原則,部分符合開放-封閉原則,降低了復雜性

// 假設 AbsractAnimalFactory 是一個抽象類或接口
// AnimalType 是一個枚舉(TIGER, CAT)
// Animal 是一個接口或抽象類// 定義 Animal 接口/抽象類
interface Animal {// 動物通用的方法(如果需要)
}// SimpleMode 下具體的 Animal 實現
class SimpleModeTiger implements Animal {// SimpleMode 老虎的具體實現
}class SimpleModeCat implements Animal {// SimpleMode 貓的具體實現
}// HardMode 下具體的 Animal 實現
class HardModeTiger implements Animal {// HardMode 老虎的具體實現
}class HardModeCat implements Animal {// HardMode 貓的具體實現
}// 定義 AnimalType 枚舉
enum AnimalType {TIGER, // 老虎類型CAT    // 貓類型
}// 定義抽象工廠 (AbsractAnimalFactory)
abstract class AbsractAnimalFactory {public abstract Animal createAnimal(AnimalType type);
}// SimpleModeAnimalFactory 實現
class SimpleModeAnimalFactory extends AbsractAnimalFactory {@Overridepublic Animal createAnimal(AnimalType type) {if (AnimalType.TIGER == type) {return new SimpleModeTiger(); // 創建 SimpleMode 老虎} else if (AnimalType.CAT == type) {return new SimpleModeCat();   // 創建 SimpleMode 貓}return null; // 或者拋出 IllegalArgumentException 異常}
}// HardModeAnimalFactory 實現
class HardModeAnimalFactory extends AbsractAnimalFactory {@Overridepublic Animal createAnimal(AnimalType type) {if (AnimalType.TIGER == type) {return new HardModeTiger(); // 創建 HardMode 老虎} else if (AnimalType.CAT == type) {return new HardModeCat();   // 創建 HardMode 貓}return null; // 或者拋出 IllegalArgumentException 異常}
}// 示例用法(可選,用于測試)
public class AnimalFactoryDemo {public static void main(String[] args) {// 創建 Simple 模式動物工廠AbsractAnimalFactory simpleFactory = new SimpleModeAnimalFactory();Animal simpleTiger = simpleFactory.createAnimal(AnimalType.TIGER); // 通過 Simple 工廠創建老虎Animal simpleCat = simpleFactory.createAnimal(AnimalType.CAT);     // 通過 Simple 工廠創建貓// 創建 Hard 模式動物工廠AbsractAnimalFactory hardFactory = new HardModeAnimalFactory();Animal hardTiger = hardFactory.createAnimal(AnimalType.TIGER);   // 通過 Hard 工廠創建老虎Animal hardCat = hardFactory.createAnimal(AnimalType.CAT);       // 通過 Hard 工廠創建貓System.out.println("創建了 Simple 模式的老虎: " + simpleTiger.getClass().getSimpleName());System.out.println("創建了 Simple 模式的貓: " + simpleCat.getClass().getSimpleName());System.out.println("創建了 Hard 模式的老虎: " + hardTiger.getClass().getSimpleName());System.out.println("創建了 Hard 模式的貓: " + hardCat.getClass().getSimpleName());}
}

優點:1.滿足了單一職責、開閉原則、解耦等優點。

缺點:1.隨著業務的不斷拓展,可能會造成類實現上的復雜度。

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

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

相關文章

在 AI 工具海洋中掌舵:Cherry Studio 如何成為你的統一指揮中心

01 被 AI 工具包圍的知識工作者現狀 在這個 AI 爆發的時代,知識工作者的工具庫正經歷前所未有的擴容。以我為例,按平臺類型梳理日常使用的 AI 工具,已然形成三層矩陣: 「云端智能助手」:Kimi、豆包、ChatGPT、Gemini…

Java 線程池技術深度解析與代碼實戰

為什么線程池總在深夜崩潰? 昨天我這項目又經歷了一次爆破——路由推送服務突然崩潰,排查發現線程池隊列堆積了幾萬任務直接把內存撐爆。早上起來看見人都麻了,線程池用不好,分分鐘變系統炸彈。今天我們就來系統梳理線程池的實戰…

Gradio可視化構建聊天機器人

Gradio是一個Python庫,專門用于快速構建和部署機器學習模型的Web界面。它的名字來源于"Gradient"(梯度),最初是為了讓機器學習開發者能夠快速展示他們的模型而設計的。 1. Gradio是什么? 核心概念 快速原…

selenium如何識別條形驗證碼,自動輸入驗證碼

在自動化測試或網頁爬取中,識別驗證碼是常見的難點。Selenium 本身不具備直接識別驗證碼的能力,但可以通過結合第三方工具、OCR 技術或人工介入等方式解決。以下是多種可行方案的詳細實現思路及代碼示例: 一、方案一:使用第三方驗…

SAP將指定EXCEL工作SHEET的數據上傳到內表

SAP將指定EXCEL工作SHEET的數據上傳到內表 本文描述了一個SAP ABAP類方法upload_excel_2internaltab,用于將Excel文件數據上傳到內部表。主要功能包括: 驗證Excel行列范圍有效性,若起始值大于結束值則拋出異常檢查文件是否存在,支…

Spring Boot(九十三):Springboot 整合cfx實現webservice接口

1 服務端 最近項目改造,有一些老項目接口協議是webservice soap1.1,這就需要我們提供webservice服務接口。在Spring Boot中整合CFX(CXF框架)以實現Web服務客戶端與服務端的功能,可以分為幾個步驟。下面我將詳細介紹如何在Spring Boot中設置一個Web服務端點,使用Apache CX…

Triton server的部署、構建、backend插件機制整體介紹

目錄 0 引言 1 什么是Trition inference server 2 Trition inference server部署 2.1 下載server 2.2 下載模型 2.3 實驗 3 triton inference server的構建 3.1 build時候需要哪些repo 3.2 構建過程做了什么 3.3 構建體驗 4 閱讀readme整體了解下backend機制 4.1 什…

Paimon在各大公司生產實踐和優化總結

這是一篇匯總和個人學習文章,主要目的是總結一下Paimon在各大公司的落地做一個學習筆記。 本文的主要內容是關于Paimon在各大公司包括Vivo、Shopee、阿里、抖音等公司的落地實踐,文末有文章來源地址,內容大概分為幾個部分: 1.引…

簡析自動駕駛產業鏈及其核心技術體系

一、自動駕駛產業鏈 自動駕駛產業鏈可以細分為感知層、決策層、執行層以及通信層等多個環節。上游部分主要包括提供環境感知所需的各種傳感器(如激光雷達、毫米波雷達、攝像頭等)、高精度地圖服務、定位系統以及其他相關硬件設備;中游涵蓋了…

第一節 布局與盒模型-Flex與Grid布局對比

一、核心特性對比?? 1. ??布局維度?? ??Flex 布局??: ??一維布局??:僅支持單方向(水平或垂直)的排列,通過 flex-direction 控制主軸方向(row 或 column)。??適用場景??&…

國產USRP X410 PRO/PRO+(相參版):寬頻段、大帶寬、多通道的4×4高性能軟件無線電設備

國產USRP X410 PRO/PRO(相參版)高性能軟件無線電,作為USRP X410的進階版本,X410 PRO/PRO核心均升級為Xilinx XCZU48DR FPGA芯片,顯著提升了信號處理能力。平臺延續了Xilinx Zynq UltraScale RFSoC的先進架構,集成四核ARM處理器及高…

Mac電腦-Office 2024 長期支持版(Excel、Word、PPT)

Office 2024 mac 是一款專為蘋果電腦用戶設計的高性能、高安全性的辦公軟件套裝 集成了Word、Excel、PowerPoint、Outlook等經典應用,為用戶提供了一站式的辦公解決方案。 不僅繼承了Office系列一貫的卓越性能,還在功能性和用戶體驗上進行了全面升級。…

vue2通過leaflet實現圖片點位回顯功能

需求:在圖片上標點了,需要根據標記點在圖片上進行回顯功能,并且不會根據窗口大小導致標記點移位 1.效果 2.下載插件 用到的是leaflet插件:一個交互式地圖 JavaScript 庫,我下載是 "leaflet": "^1.9.4&…

OmniDocBench:一鍵評測PDF解析算法

絕大多數文檔格式都能無損轉換至PDF,解決了PDF解析,也就相當于解決了絕大多數文檔的解析。所以,PDF解析算法是文檔服務的基石技術。 PDF解析算法目前有兩類技術路線 pipeline方法,整合layout analysis, OCR, formula/table reco…

[按鍵精靈安卓/ios腳本插件開發] 遍歷獲取LuaAuxLib函數庫命令輔助工具

LuaAuxLib庫 LuaAuxLib是按鍵精靈所有內置命令所在的庫文件,有多種方式來獲取LuaAuxLib庫下的函數命令,例如反編譯按鍵精靈手機端庫文件等。這里咱們來介紹一種淺顯易懂的方式來獲取,直接for循環遍歷獲取函數名。 ScanLuaAuxLib 我們寫一個自…

深度學習和計算機視覺的關系的理解

深度學習和計算機視覺的關系 深度學習作為人工智能的重要分支,近年來在計算機視覺領域取得了革命性突破。計算機視覺的核心任務包括圖像分類、目標檢測、語義分割等,而深度學習通過神經網絡模型自動學習圖像特征,極大提升了這些任務的準確率…

springboot開發項目 SLF4J+Logback日志框架集成【最終篇】

在這篇文章之前,實際對于 springboot和SLF4JLogback日志框架的使用 我已經分享過3篇關于springboot 日志的文章了。為什么會在寫這篇最終篇,因為 前3篇分享的關于springBoot框架日志的配置方案, 發現了一個問題:只有項目啟動的時候…

phpstudy無法啟動apache,80端口被占用,完美解決

phpstudy無法啟動apache,80端口被占用,完美解決 解決方法一(最推薦) 依次點擊網站-管理-修改 將端口由80改為81,再點擊確認后即可重新啟動apache。 需要注意的是,網站的訪問由127.0.0.1變為127.0.0.1:81。默認是80的端口所以可以不…

Loggers 配置解析(log4j.xml)

Loggers 配置解析 我們通過下面的例子來理解 log4j 的 Loggers 配置是如何決定日志輸出規則的。 <Loggers><!-- 根Logger&#xff1a;全局配置 --><Root level"debug"><AppenderRef ref"consoleAppender" level"info"/&g…

Java 大視界 -- Java 大數據在智能政務輿情監測與引導中的情感分析與話題挖掘技術(272)

&#x1f496;親愛的朋友們&#xff0c;熱烈歡迎來到 青云交的博客&#xff01;能與諸位在此相逢&#xff0c;我倍感榮幸。在這飛速更迭的時代&#xff0c;我們都渴望一方心靈凈土&#xff0c;而 我的博客 正是這樣溫暖的所在。這里為你呈上趣味與實用兼具的知識&#xff0c;也…