Java創建型模式---工廠模式

工廠模式基礎概念

工廠模式是一種創建型設計模式,其核心思想是將對象的創建和使用分離。通過使用工廠模式,可以將對象創建邏輯集中管理,提高代碼的可維護性和可擴展性。在 Java 中,工廠模式主要分為三種類型:

  1. 簡單工廠模式?- 基礎實現,不屬于 GOF 23 種設計模式
  2. 工廠方法模式?- 定義創建對象的接口,由子類決定實例化哪個類
  3. 抽象工廠模式?- 創建一系列相關或依賴對象的接口,無需指定具體類

簡單工廠模式

簡單工廠模式是工廠模式的基礎實現,它定義了一個創建對象的類,根據參數的不同返回不同類的實例。

示例代碼
// 產品接口
interface Product {void operation();
}// 具體產品類A
class ConcreteProductA implements Product {@Overridepublic void operation() {System.out.println("ConcreteProductA operation");}
}// 具體產品類B
class ConcreteProductB implements Product {@Overridepublic void operation() {System.out.println("ConcreteProductB operation");}
}// 簡單工廠類
class SimpleFactory {public static Product createProduct(String type) {switch (type) {case "A":return new ConcreteProductA();case "B":return new ConcreteProductB();default:throw new IllegalArgumentException("Invalid product type: " + type);}}
}// 客戶端代碼
public class SimpleFactoryClient {public static void main(String[] args) {Product productA = SimpleFactory.createProduct("A");productA.operation(); // 輸出: ConcreteProductA operationProduct productB = SimpleFactory.createProduct("B");productB.operation(); // 輸出: ConcreteProductB operation}
}

優點:實現簡單,將對象創建和使用分離
缺點:工廠類職責過重,不符合開閉原則(新增產品需修改工廠類)

工廠方法模式

工廠方法模式定義了一個創建對象的接口,讓子類決定實例化哪個類。工廠方法將類的實例化延遲到子類。

示例代碼
// 產品接口
interface Product {void operation();
}// 具體產品類A
class ConcreteProductA implements Product {@Overridepublic void operation() {System.out.println("ConcreteProductA operation");}
}// 具體產品類B
class ConcreteProductB implements Product {@Overridepublic void operation() {System.out.println("ConcreteProductB operation");}
}// 抽象工廠類
abstract class Factory {public abstract Product createProduct();
}// 具體工廠類A - 生產產品A
class ConcreteFactoryA extends Factory {@Overridepublic Product createProduct() {return new ConcreteProductA();}
}// 具體工廠類B - 生產產品B
class ConcreteFactoryB extends Factory {@Overridepublic Product createProduct() {return new ConcreteProductB();}
}// 客戶端代碼
public class FactoryMethodClient {public static void main(String[] args) {Factory factoryA = new ConcreteFactoryA();Product productA = factoryA.createProduct();productA.operation(); // 輸出: ConcreteProductA operationFactory factoryB = new ConcreteFactoryB();Product productB = factoryB.createProduct();productB.operation(); // 輸出: ConcreteProductB operation}
}

優點:符合開閉原則,擴展性好
缺點:類的數量可能過多,增加系統復雜度

抽象工廠模式

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

示例代碼
// 產品A接口
interface ProductA {void operationA();
}// 產品B接口
interface ProductB {void operationB();
}// 具體產品A1
class ConcreteProductA1 implements ProductA {@Overridepublic void operationA() {System.out.println("ConcreteProductA1 operationA");}
}// 具體產品A2
class ConcreteProductA2 implements ProductA {@Overridepublic void operationA() {System.out.println("ConcreteProductA2 operationA");}
}// 具體產品B1
class ConcreteProductB1 implements ProductB {@Overridepublic void operationB() {System.out.println("ConcreteProductB1 operationB");}
}// 具體產品B2
class ConcreteProductB2 implements ProductB {@Overridepublic void operationB() {System.out.println("ConcreteProductB2 operationB");}
}// 抽象工廠接口
interface AbstractFactory {ProductA createProductA();ProductB createProductB();
}// 具體工廠1 - 生產產品A1和產品B1
class ConcreteFactory1 implements AbstractFactory {@Overridepublic ProductA createProductA() {return new ConcreteProductA1();}@Overridepublic ProductB createProductB() {return new ConcreteProductB1();}
}// 具體工廠2 - 生產產品A2和產品B2
class ConcreteFactory2 implements AbstractFactory {@Overridepublic ProductA createProductA() {return new ConcreteProductA2();}@Overridepublic ProductB createProductB() {return new ConcreteProductB2();}
}// 客戶端代碼
public class AbstractFactoryClient {public static void main(String[] args) {// 使用工廠1創建產品族1AbstractFactory factory1 = new ConcreteFactory1();ProductA productA1 = factory1.createProductA();ProductB productB1 = factory1.createProductB();productA1.operationA(); // 輸出: ConcreteProductA1 operationAproductB1.operationB(); // 輸出: ConcreteProductB1 operationB// 使用工廠2創建產品族2AbstractFactory factory2 = new ConcreteFactory2();ProductA productA2 = factory2.createProductA();ProductB productB2 = factory2.createProductB();productA2.operationA(); // 輸出: ConcreteProductA2 operationAproductB2.operationB(); // 輸出: ConcreteProductB2 operationB}
}

優點

  • 可以在類的內部對產品族中相關聯的多等級產品共同管理
  • 客戶端始終只使用一個工廠的對象
  • 符合開閉原則

缺點

  • 產品族擴展困難(新增一個產品需要修改多個接口和類)
  • 實現復雜

三種工廠模式的對比

類型工廠職責產品等級結構擴展性
簡單工廠模式集中所有產品創建單一等級不符合開閉原則
工廠方法模式由子類負責創建單一等級符合開閉原則
抽象工廠模式創建一系列產品多個等級(產品族)產品族擴展困難

工廠模式的應用場景

  1. 對象創建邏輯復雜?- 當對象創建過程涉及復雜的初始化邏輯時
  2. 根據條件動態創建對象?- 如根據配置或用戶輸入創建不同類型的對象
  3. 產品等級結構管理?- 當系統需要處理多個產品族時

注意事項

  1. 避免過度使用?- 簡單場景下無需使用工廠模式
  2. 權衡設計復雜度?- 選擇合適的工廠模式類型
  3. 與其他模式結合?- 工廠模式常與單例模式、策略模式等結合使用

工廠模式是一種非常實用的設計模式,它能夠將對象的創建和使用分離,提高代碼的可維護性和可擴展性。在實際應用中,需要根據具體場景選擇合適的工廠模式實現。

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

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

相關文章

分布式定時任務:xxl-job

基礎 XXL - Job采用的是調度中心(Scheduler)與執行器(Executor)分離的架構設計,這種設計帶來了諸多優勢,比如高可用性、可擴展性以及便于分布式部署等。 1. 調度中心(XXL - Job Admin&#xf…

易語言實現釘釘PC端高頻率鏈接批量打開系統

易語言實現釘釘PC端高頻率鏈接批量打開系統 一、需求分析與技術方案 核心需求: 在釘釘PC端私聊消息中嵌入特殊格式鏈接用戶點擊后通過自定義協議喚醒本地程序支持每分鐘處理10萬次請求的批量操作實現鏈接的批量生成和管理技術方案: #mermaid-svg-AYoMWYQQf71dlyEF {font-fa…

MyBatis如何實現動態數據源切換?

大家好,我是鋒哥。今天分享關于【MyBatis如何實現動態數據源切換?】面試題。希望對大家有幫助; MyBatis如何實現動態數據源切換? 超硬核AI學習資料,現在永久免費了! 在MyBatis中實現動態數據源切換&#…

實踐篇:14-構建 Node.js 應用程序鏡像

背景介紹 Node.js是一個基于 Chrome V8 引擎的 JavaScript 運行時環境,以其事件驅動、非阻塞 I/O 模型而聞名,廣泛用于構建后端服務和前端應用。 Node.js 的特點使其非常適合容器化部署: 輕量級運行時:相比傳統后端語言&#xf…

Spring Cloud 微服務(鏈路追蹤與日志聚合)

📌 摘要 在微服務架構中,隨著服務數量的增加和調用關系的復雜化,傳統的日志記錄方式已經無法滿足對系統運行狀態的全面掌控。如何快速定位異常請求、分析服務調用耗時、追蹤完整鏈路成為運維和開發人員面臨的核心挑戰。 為此,Sp…

PADS交互式布局

PADS的交互式布局通過原理圖與PCB的雙向聯動大幅提升設計效率。在原理圖中框選電路模塊時,PCB視圖將自動高亮對應元件組并生成可移動簇,拖動時保持模塊內部相對位置不變。布局過程中啟用實時推擠功能(Placement Shoving)&#xff…

類圖+案例+代碼詳解:軟件設計模式----原型模式

5、原型模式 通過復制現有對象來創建新對象,避免從零開始構建,就像 “復印文件” 一樣。 克隆的核心是復用現有對象狀態 用 克隆熊貓 舉例,秒懂原理 假設你有一只熊貓對象(屬性:名字、年齡、毛色)&#…

Python-FAQ-__name__、__main__

1 需求 2 接口 3 示例 4 參考資料 在 Python 中,像 __name__ 這樣的雙下劃線屬性(也稱為 "dunder" 屬性,即 "double underscore" 的縮寫)是 Python 的特殊屬性或方法,它們為類、對象或模塊提供了…

Adobe高階技巧與設計師創意思維的進階指南

作為一名在全球設計圈摸爬滾打了十年的職業設計師,我深知創意與技術的結合是點燃靈感的火花。憑借英國Parvis School of Economics and Music大學提供的Adobe正版教育訂閱,我得以在設計之路上不斷探索與突破。今天,我想以輕松實用的口吻&…

音視頻會議服務搭建(設計方案-Go服務端API業務邏輯流程圖)-04

前言 這一篇是 關于 Go服務端相關的音視頻會議的接口API業務邏輯流程圖肯定是不能完全復用到你的項目中去的,但是希望對你有一些參考性的幫助嗯,我也是在不斷的進行完善和優化,并不是最終的結構,先定好大方向,然后不斷…

C++ Qt Widget繪圖畫布縮放與平移:實現CAD級交互體驗

在圖形應用程序開發中,實現流暢的縮放和平移功能是創建專業級繪圖工具的基礎。本文將深入探討如何在Qt Widget中實現CAD級別的交互體驗,包括視圖變換、坐標系統管理以及交互功能實現。核心概念:視圖變換與坐標系統 在圖形應用中,我…

Paimon 位圖索引解析:高效等值查詢的秘密( Bit-Sliced Index)

BitmapFileIndexBitmapFileIndex 這個類 是 Paimon 中一個非常重要的索引類型,它使用位圖(Bitmap)來精確定位數據,尤其擅長處理低基數(low-cardinality)列的等值查詢。BitmapFileIndex 實現了 FileIndexer …

S7-1200 CPU 與 S7-200 CPU S7通信(S7-1200 作為服務器

7-1200 CPU 與 S7-200 CPU S7通信(S7-1200 作為服務器) S7-1200 CPU 與 S7-200 CPU 之間的通信只能通過 S7 通信來實現,因為 S7-200 的以太網模塊只支持S7 通信。當S7-200作為客戶端,S7-1200作為服務器,需在客戶端單邊…

pyspark大規模數據加解密優化實踐

假如有1億行數據 方法1 spark udf解密 from pyspark.sql import SparkSession import pyspark.sql.functions as F from pyDes import * import binasciisparkSparkSession.builder.getOrCreate()def dec_fun(text):key triple_des(b"HHHHHHHHHHHHHHHHHHHHHHHH", CB…

華為云Flexus+DeepSeek征文|華為云ECS與CCE:從介紹到架構部署·僅需要此文足矣

前引:當今的企業面臨著前所未有的技術挑戰:如何構建既安全又高效、既靈活又可靠的云服務架構?如何有效整合人工智能技術,打造智能化的運維和服務體系?這些問題的答案,正在悄然改變著企業級IT基礎設施的生態…

DAY 50 預訓練模型+CBAM模塊

浙大疏錦行https://blog.csdn.net/weixin_45655710 知識點回顧: resnet結構解析CBAM放置位置的思考針對預訓練模型的訓練策略 差異化學習率三階段微調 作業: 好好理解下resnet18的模型結構嘗試對vgg16cbam進行微調策略 ResNet-18 結構核心思想 可以將R…

docker連接mysql

查看在運行的容器:docker ps -s 進入容器:docker exec -it 容器號或名 /bin/bash,如:docker exec -it c04c438ff177 /bin/bash 或docker exec -it mysql /bin/bash。 3. 登錄mysql:mysql -uroot -p123456

javaweb第182節Linux概述~ 虛擬機連接不上FinalShell

問題描述 虛擬機無法連接到finalshell 報錯 session.connect:java.net.socketexception:connection reset 或者 connection is closed by foreign host 解決 我經過一系列的排查,花費了一天的時間后,發現,只是因為,我將連接…

高壓電纜護層安全的智能防線:TLKS-PLGD 監控設備深度解析

在現代電力系統龐大復雜的網絡中,高壓電纜護層是守護電力傳輸的 "隱形鎧甲",其安全直接影響電網穩定。傳統監測手段響應慢、精度低,難以滿足安全運維需求。TLKS-PLGD 高壓電纜護層環流監控設備應運而生,提供智能化解決方…

Element-Plus Cascader 級聯選擇器獲取節點名稱和value值方法

html 部分 <template><el-cascaderref"selectAeraRef":options"areas":disabled"disabled":props"optionProps"v-model"selectedOptions"filterablechange"handleChange"><template #default"…