告別硬編碼!用工廠模式優雅構建可擴展的 Spring Boot 應用 [特殊字符]

嗨,各位技術伙伴們!👋

在日常的軟件開發中,我們經常面臨需求變更的挑戰。如何構建一個既能滿足當前需求,又能輕松應對未來變化的系統呢?答案往往藏在那些經典的設計模式中。

今天,我們就來聊聊創建型模式中的明星——工廠模式 (Factory Patterns),并深入探討如何將其與強大的 Spring Boot 框架結合,打造出專業、靈活且易于維護的企業級應用。

什么是工廠模式?🤔

簡單來說,工廠模式的核心思想就是將對象的創建過程封裝起來,讓客戶端代碼與具體對象的創建細節解耦。想象一下,你不再需要親自去?new?一個復雜的對象,而是向一個“工廠”索要,工廠會根據你的需求生產出合適的對象。

工廠模式家族主要有三位成員:

  • 簡單工廠 (Simple Factory):一個工廠類根據傳入參數創建不同產品。簡單直接,但不易擴展。
  • 工廠方法 (Factory Method):定義一個創建對象的接口,但由子類決定實例化哪個類。符合開閉原則,擴展性更好。
  • 抽象工廠 (Abstract Factory):用于創建一系列相關或相互依賴的對象(即一個產品族),而無需指定它們具體的類。

其中,工廠方法模式是應用非常廣泛的一種。它的結構大致如下:

工廠模式在 Spring Boot 中的身影 💡

Spring 框架本身就是一個巨大的“工廠”的成功實踐者!其核心的?IoC (控制反轉) 容器就負責了我們應用中幾乎所有對象 (Beans) 的創建、配置和管理。

在 Spring Boot 中,工廠模式的思想更是無處不在:

  1. @Bean?方法:在?@Configuration?類中,每一個被?@Bean?注解的方法都充當了一個工廠方法。Spring 調用這些方法來創建和管理 Bean 實例。

    @Configuration
    public class AppConfig {@Bean // 我就是一個工廠方法!public MyService myService(MyDependency dependency) {return new MyServiceImpl(dependency);}
    }
  2. FactoryBean?接口:Spring 提供的?FactoryBean?接口允許我們自定義更復雜的 Bean 創建邏輯。實現了該接口的類,其?getObject()?方法就是名副其實的工廠方法。

  3. 自動配置 (Auto-configuration):Spring Boot 的自動配置機制,在某種程度上也體現了抽象工廠的思想。它能根據不同的條件(如類路徑、屬性配置)為我們自動裝配一整套協同工作的 Bean(一個“產品族”)。

實戰演練:構建一個靈活的支付系統 💳

理論講了不少,讓我們通過一個實戰項目來感受工廠模式的魅力。我們將構建一個支持多種支付方式(如支付寶、微信支付、銀行卡支付)的系統。

核心思路

  1. 定義一個統一的?PaymentService?支付接口。
  2. 為每種支付方式創建具體的實現類 (如?AlipayServiceImpl),并將它們注冊為 Spring 的?@Service?Bean。
  3. 創建一個?PaymentServiceFactoryImpl,它利用 Spring 的依賴注入特性,自動收集所有?PaymentService?的實現。
  4. 提供一個方法,根據傳入的支付類型,從工廠中獲取相應的服務實例。
  5. 通過一個?PaymentController?暴露 API,接收支付請求并調用工廠進行處理。

下面是我們支付系統核心組件的簡化結構圖:

關鍵代碼片段(示意):

  • PaymentService?接口:

    public interface PaymentService {void pay(BigDecimal amount);PaymentType getServiceType(); // 用于工廠識別
    }
  • AlipayServiceImpl?(具體服務):

    @Service("alipayService")
    public class AlipayServiceImpl implements PaymentService {// ... 實現 pay() 和 getServiceType()
    }
  • PaymentServiceFactoryImpl?(核心工廠):

    @Component
    public class PaymentServiceFactoryImpl {private final Map<PaymentType, PaymentService> serviceCache;@Autowired // 注入所有PaymentService實現public PaymentServiceFactoryImpl(List<PaymentService> services) {// ... 初始化serviceCache}public PaymentService getPaymentService(PaymentType type) {// ... 從cache中獲取}
    }

這種設計的最大好處是什么??可擴展性!?當我們需要支持一種新的支付方式(比如 Apple Pay)時,只需要:

  1. 在?PaymentType?枚舉中添加新類型。
  2. 創建一個?ApplePayServiceImpl?實現?PaymentService接口,并標記為?@Service
  3. 完成!?工廠會自動發現并注冊這個新服務,無需修改工廠或控制器的代碼,完美符合開閉原則

核心優勢與總結 🌟

通過本次學習和實踐,我們可以看到工廠模式(特別是結合 Spring Boot 特性)能為我們帶來:

  • 高度解耦:客戶端與具體產品實現分離。
  • 增強靈活性:輕松切換和新增產品實現。
  • 提高可維護性:代碼結構更清晰,職責更分明。
  • 遵循開閉原則:對擴展開放,對修改關閉。

設計模式并非銀彈,但它們是前人智慧的結晶,能幫助我們寫出更優雅、更健壯的代碼。

動手實踐,一探究竟!🚀

理論與實踐相結合才能真正掌握。我已經將本次學習和實踐的完整代碼(包括基礎的工廠模式示例和 Spring Boot 支付系統項目)上傳到了 GitHub,歡迎大家克隆、學習和交流!

代碼倉庫地址:?https://github.com/Wilsoncyf/design-pattern-springboot.git


學習設計模式是一個持續精進的過程。您在項目中常用的設計模式有哪些呢?歡迎在評論區留言,一起交流探討,共同進步!💪

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

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

相關文章

【Linux】編譯器gcc/g++及其庫的詳細介紹

前言&#xff1a; 上文我們學到了&#xff0c;LInux中的的編輯器vim【Linux】vim編輯器-CSDN博客 本文來學習LInux中的編譯器&#xff1a;gcc/g gcc是C語言編譯器&#xff0c;g是C編譯器&#xff0c;這兩個的使用一模一樣。這里我們主要使用gcc給大家介紹 1.格式 gcc 被編譯的…

用“紅燒魚”類比說明卷積神經網絡CNN的概念

我們用一個生活中的例子——「廚房做紅燒魚」 的場景&#xff0c;來類比卷積神經網絡中多層卷積核的工作過程。你會發現&#xff0c;卷積層就像廚房里分工明確的廚師團隊&#xff0c;逐步處理食材&#xff0c;最終完成一道復雜的菜品。 &#x1f41f; 生活案例&#xff1a;廚房…

uniapp與微信小程序開發平臺聯調無法打開IDE

經測試屬于網絡問題。本機需要聯網。否則會出現Hbuilder運行微信小程序到模擬器時無法打開 微信開發者工具 這個頁面出不來會一直顯示異常。這期間微信小程序開發工具的端口是通的 需要先聯網

內網穿透之Linux版客戶端安裝(神卓互聯)

選擇Linux系統版本 獲取安裝包 &#xff1a;https://www.shenzhuohl.com/download.html 這里以Ubuntu 18.04為例&#xff0c;其它版本方法類似 登錄Ubuntu操作系統&#xff1a; 打開Ubuntu系統終端&#xff0c;更新版本 apt-get update 安裝運行環境&#xff1a; 安裝C 運…

硬件學習筆記--66 MCU的DMA簡介

DMA&#xff08;Direct Memory Access&#xff0c;直接存儲器訪問&#xff09;是MCU中一種重要的數據傳輸機制&#xff0c;它允許外設與存儲器之間或存儲器與存儲器之間直接傳輸數據&#xff0c;而無需CPU的持續干預。 1、DMA的基本原理 1.1 核心概念&#xff1a; 1&#xf…

DeepSeek本地部署及WebUI可視化教程

前言 DeepSeek是近年來備受關注的大模型之一,支持多種推理和微調場景。很多開發者希望在本地部署DeepSeek模型,并通過WebUI進行可視化交互。本文將詳細介紹如何在本地環境下部署DeepSeek,并實現WebUI可視化,包括Ollama和CherryStudio的使用方法。 一、環境準備 1. 硬件要…

RK3588和FPGA橋片之間IO電平信號概率性不能通信原因

1.GPIO管腳配置問題 RK3588對IO進行配置的時候&#xff0c;如果配置為多功能復用&#xff0c;沒有明確IO功能&#xff0c;可能引起信號接收不穩定&#xff0c; 需要在驅動中設備樹中配置管腳為GPIO功能&#xff0c;確保沒有功能復用的干擾。 2.上下拉電阻阻值設置不當 GPIO引腳…

相機--相機標定實操

教程 camera_calibration移動畫面示例 usb_cam使用介紹和下載 我使用的是USB相機&#xff0c;所以直接使用ros的usb_cam功能包驅動相機閉關獲取實時圖像&#xff0c;然后用ros的camera_calibration標定相機。 查詢攝像機的信息 v4l2-ctl -d 0 --all的作用 命令詳解&#xf…

【Kotlin】高階函數Lambda內聯函數

【Kotlin】簡介&變量&類&接口 【Kotlin】數字&字符串&數組&集合 【Kotlin】高階函數&Lambda&內聯函數 【Kotlin】表達式&關鍵字 文章目錄 函數還是屬性高階函數抽象和高階函數實例&#xff1a; 函數作為參數的需求方法引用表達式更多使用場…

飛算JavaAI 炫技賽重磅回歸!用智能編碼攻克老項目重構難題

深夜還在排查十年前Hibernate框架埋下的N1查詢隱患&#xff1f;跨語言遷移時發現SpringMVC控制器里的業務邏輯像一團亂麻&#xff1f;當企業數字化進入深水區&#xff0c;百萬行代碼的老系統就像一座隨時可能崩塌的"技術債冰山"。近日&#xff0c;飛算科技發布JavaAI…

Linux I2C 子系統全解:結構、機制與工程實戰

Linux I2C 子系統全解&#xff1a;結構、機制與工程實戰 前言 I2C&#xff08;Inter-Integrated Circuit&#xff09;作為嵌入式系統和各種電子產品中最常用的串行通信總線之一&#xff0c;在 Linux 內核中的地位極其重要。然而&#xff0c;Linux I2C 子系統的分層結構、對象模…

多線程編程技術解析及示例:pthread_cond_timedwait、pthread_mutex_lock 和 pthread_mutex_trylock

多線程編程技術解析及示例&#xff1a;pthread_cond_timedwait、pthread_mutex_lock 和 pthread_mutex_trylock 摘要 本文深入解析了多線程編程中 pthread_cond_timedwait、pthread_mutex_lock 和 pthread_mutex_trylock 三個函數的功能、使用場景及注意事項&#xff0c;并通…

元胞自動機(Cellular Automata, CA)

一、什么是元胞自動機&#xff08;Cellular Automata, CA&#xff09; 元胞自動機&#xff08;CA&#xff09; 是一種基于離散時間、離散空間與規則驅動演化的動力系統&#xff0c;由 馮諾依曼&#xff08;John von Neumann&#xff09; 于1940年代首次提出&#xff0c;用于模…

Flutter面試題

Flutter架構解析 1. Flutter 是什么?它與其他移動開發框架有什么不同? Flutter 是 Google 開發的開源移動應用開發框架,可用于快速構建高性能、高保真的移動應用(iOS 和 Android),也支持 Web、桌面和嵌入式設備。。它與其他移動開發框架(如 React Native、Xamarin、原…

MySQL 如何判斷某個表中是否存在某個字段

在MySQL中&#xff0c;判斷某個表中是否存在某個字段&#xff0c;可以通過查詢系統數據庫 INFORMATION_SCHEMA.COLUMNS 實現。以下是詳細步驟和示例&#xff1a; 方法&#xff1a;使用 INFORMATION_SCHEMA.COLUMNS 通過查詢系統元數據表 COLUMNS&#xff0c;檢查目標字段是否存…

golang 實現基于redis的并行流量控制(計數鎖)

在業務開發中&#xff0c;有時需要對某個操作在整個集群中限制并發度&#xff0c;例如限制大模型對話的并行數。基于redis zset實現計數鎖&#xff0c;做個筆記。 關鍵詞&#xff1a;并行流量控制、計數鎖 package redisutilimport ("context""fmt""…

從線性方程組角度理解公式 s=n?r(3E?A)

從線性方程組角度理解公式 sn?r(3E?A) 這個公式本質上是 ?齊次線性方程組解空間維度 的直接體現。下面通過三個關鍵步驟解釋其在線性方程組中的含義&#xff1a; 1. ?公式對應的線性方程組 考慮矩陣方程&#xff1a; (3E?A)x0 其中&#xff1a; x 是 n 維未知向量3E?…

Docker 在 AI 開發中的實踐:GPU 支持與深度學習環境的容器化

人工智能(AI)和機器學習(ML),特別是深度學習,正以前所未有的速度發展。然而,AI 模型的開發和部署并非易事。開發者常常面臨復雜的依賴管理(如 Python 版本、TensorFlow/PyTorch 版本、CUDA、cuDNN)、異構硬件(CPU 和 GPU)支持以及環境復現困難等痛點。這些挑戰嚴重阻…

解決CSDN等網站訪問不了的問題

原文網址&#xff1a;解決CSDN等網站訪問不了的問題-CSDN博客 簡介 本文介紹解決CSDN等網站訪問不了的方法。 問題描述 CSDN訪問不了了&#xff0c;頁面是空的。 問題解決 方案1&#xff1a;修改DNS 可能是dns的問題&#xff0c;需要重新配置。 國內常用的dns是&#x…

使用tortoisegit連接遠程倉庫進行克隆、拉取、獲取、提交、推送、新建/切換分支、重命名、刪除的一套流程(附帶巨全面的git命令)

1.整備好tortoisegit工具。 2.新建一個文件夾&#xff0c;并進入這個文件夾后鼠標右擊&#xff08;選擇克隆&#xff09;&#xff1a; 3.先去項目中拿到https地址&#xff0c;再填入&#xff1a; 4.新建分支&#xff0c;右擊克隆到本地的項目文件&#xff1a; 5.推送到遠程&am…