面試官:Spring中都應用了哪些設計模式?

設計模式是我們項目中經常會涉及到的項目進行重構、解構時的一種方法。

比如我們常見的單例模式、工廠模式、策略模式、裝飾器模式等都是比較常用的;關于 23 種設計模式,大家可以找本書專門去學習一下,在 Java 框架的源碼中也不例外,設計模式的使用實在是太多了,本篇文章就來給大家盤點分析一下Spring中用到了哪些設計模式。

設計模式分類

設計模式

在Java中,設計模式是解決常見設計問題的最佳實踐和經驗總結。它們幫助開發者設計更靈活、可維護且可擴展的軟件系統。以下是Java中常見的一些設計模式分類及其示例:

創建型模式(Creational Patterns)

  • 單例模式(Singleton):確保一個類只有一個實例,并提供一個全局訪問點。

  • 工廠方法模式(Factory Method):定義一個用于創建對象的接口,讓子類決定實例化哪一個類。

  • 抽象工廠模式(Abstract Factory):提供一個接口,用于創建相關或依賴對象的家族,而不需要明確指定具體類。

  • 建造者模式(Builder):將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。

  • 原型模式(Prototype):用原型實例指定創建對象的種類,并且通過拷貝這些原型創建新的對象。

結構型模式(Structural Patterns)

  • 適配器模式(Adapter):將一個類的接口轉換成客戶希望的另一個接口,使得原本由于接口不兼容而無法一起工作的類可以一起工作。

  • 組合模式(Composite):將對象組合成樹形結構以表示“部分-整體”的層次結構,組合模式使得用戶對單個對象和組合對象的使用具有一致性。

  • 裝飾器模式(Decorator):動態地給一個對象添加一些額外的職責,就增加功能來說,裝飾器模式相比生成子類更為靈活。

  • 橋接模式(Bridge):將抽象部分與它的實現部分分離,使它們都可以獨立地變化。

  • 外觀模式(Facade):為子系統中的一組接口提供一個一致的界面,定義了一個高層接口,這個接口使得這一子系統更加容易使用。

  • 享元模式(Flyweight):運用共享技術有效地支持大量細粒度的對象。

  • 代理模式(Proxy):為其他對象提供一個代理以控制對這個對象的訪問。

行為型模式(Behavioral Patterns)

  • 迭代器模式(Iterator):提供一種方法順序訪問一個聚合對象中各個元素,而又不需暴露該對象的內部表示。

  • 觀察者模式(Observer):定義對象之間的一種一對多的依賴關系,當一個對象改變狀態時,它的所有依賴者都會收到通知并自動更新。

  • 模板方法模式(Template Method):定義一個操作中的算法的框架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變一個算法的結構即可重新定義該算法的某些特定步驟。

  • 命令模式(Command):將一個請求封裝為一個對象,從而使你可用不同的請求對客戶進行參數化;對請求排隊或記錄請求日志,以及支持可撤銷的操作。

  • 狀態模式(State):允許一個對象在其內部狀態改變時改變它的行為。對象看起來似乎修改了它的類。

  • 策略模式(Strategy):定義了一系列的算法,并將每一個算法封裝起來,使它們可以互相替換。策略模式使得算法可以獨立于使用它的客戶而變化。

  • 職責鏈模式(Chain of Responsibility):避免請求發送者與接收者耦合在一起,讓多個對象都有可能接收請求,將這些對象連接成一條鏈,并且沿著這條鏈傳遞請求,直到有對象處理它為止。解釋器模式(Interpreter):給定一個語言,定義它的文法的一種表示,并定義一個解釋器,該解釋器使用該表示來解釋語言中的句子。

  • 中介者模式(Mediator):用一個中介對象來封裝一系列的對象交互,中介者使各對象不需要顯式地相互引用,從而使其耦合松散,而且可以獨立地改變它們之間的交互。

  • 訪問者模式(Visitor):表示一個作用于某對象結構中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用于這些元素的新操作。備忘錄模式(Memento):在不破壞封裝性的前提下,捕獲一個對象的內部狀態,并在該對象之外保存這個狀態。這樣以后就可將該對象恢復到原先保存的狀態。

  • 空對象模式(Null Object):使用空對象而不是null引用。

  • 規格模式(Specification):定義了一系列算法的約束條件。

這么一總結,看起來設計模式那是真的特別的多。那么在Spring 中都使用到了哪些設計模式呢?

Spring 中用到了哪些設計模式

在Spring框架中,用到了多種設計模式,這些設計模式為框架提供了強大的功能和靈活性。下面我們來盤點一下:

簡單工廠模式(Simple Factory Pattern)

  • 應用在BeanFactory上,Spring的BeanFactory充當工廠,負責根據配置信息創建Bean實例。

  • 這是一種工廠模式的應用,根據指定的類名或ID創建Bean對象。

工廠方法模式(Factory Method Pattern)

  • 應用在FactoryBean接口上,允許用戶自定義Bean的創建邏輯。

  • 開發人員可以使用FactoryBean來創建復雜的Bean實例。

單例模式(Singleton Pattern)

  • Spring默認將Bean配置為單例,確保在容器中只有一個共享的實例。

適配器模式(Adapter Pattern)

  • 在Spring MVC中的HandlerAdapter應用,允許不同類型的處理器適配到處理器接口,實現統一的處理器調用。

  • 類似地,ViewResolver、MessageConverter等也是適配器模式的應用。

代理模式(Proxy Pattern)

  • 在Spring的AOP(面向切面編程)底層通過代理模式來實現切面功能,包括JDK動態代理和CGLIB代理。

觀察者模式(Observer Pattern)

  • 應用在Spring的事件監聽機制上,允許組件監聽和響應特定類型的事件,實現松耦合的組件通信。

策略模式(Strategy Pattern)

  • 在Spring的包掃描時使用,如@ComponentScan注解中的excludeFilters和includeFilters,用于定義掃描時的過濾策略。

如果我們在面試的時候被問到這個問題的時候,我們就得學會如何回答,而且一次性也不用說出太多,但是總有一個得分析明白,比如其中簡單的代理模式以及工廠模式,結合實際的類來進行分析,這樣這個問題就算是回答的可以了。

關于 Spring 中的設計模式,你了解了多少呢?

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

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

相關文章

SRE養成計劃之01-基本命令(持續更新)

基本命令(續) 軟連接 軟連接 --> 原始文檔 --> 文檔數據格式:ln -s 原始文件或目錄 軟連接文件若原始文件或目錄被刪除,鏈接文件將失效軟連接可存放在不同分分區/文件系統 硬鏈接 硬鏈接 --> 文檔數據格式&#xff1…

如何用python做一個用戶登錄界面——潯川python社

1 需解決的問題: 1.1如何用python做一個用戶登錄界面? 1.2需要用到哪些庫、模塊? 2 問題解決: 2.1 回答 1.1 :合理即可,無標準回答。 2.2 回答 1.2 :tk庫(縮寫)、GUL界面…

C++20實戰之channel

C20實戰之channel 繼前面兩節的直播,講解了thread、jthread、stop_token、stop_source、stop_callback、cv、cv_any等的用法與底層實現,那么如何基于這些知識實現一個小項目呢? 于是引出了這篇,寫一個channel出來。 注&#xff1a…

【算法】快速冪

算法-快速冪 前置知識 倍增 思路 我們要求 a n a^n an。 簡單的方法是 a n a n ? 1 ? a a^na^{n-1}\cdot a anan?1?a 但是我們不妨使用倍增的思想 若 2 ∣ n 2\mid n 2∣n,則 a n a n 2 2 a^n{a^{\frac n 2}}^2 ana2n?2 若 2 ? n 2\nmid n 2?n&…

【AI】設計師人人必備的Ai課程,AIGC實戰教學

課程介紹 專為設計師定制的AI繪畫視覺課程,包含排版、插畫、海報和動漫等。共43節課程,2.06G視頻,教授AI應用技巧,提高設計效率和質量。內容涵蓋詞生圖方法、AI風格設計等,幫助學員在設計領域取得成就。 1_01-ai課程…

Flutter 中的 SliverPersistentHeader 小部件:全面指南

Flutter 中的 SliverPersistentHeader 小部件:全面指南 Flutter 是一個功能強大的 UI 工具集,用于創建美觀、高性能的移動和 web 應用。在 Flutter 的滾動組件中,SliverPersistentHeader 是一個特殊的組件,它用于在 CustomScroll…

zustand修改一個object對象的嵌套屬性,會觸發更新嗎

在 Zustand 狀態管理庫中,當使用 set 方法來更新一個對象的嵌套屬性時,并不會觸發整個對象的更新操作。相反,Zustand 使用了淺比較來檢測狀態的變化,只有當狀態內部的引用發生變化時,才會觸發更新操作。 因此&#xf…

jrt落地deepin

經過昨天一晚上的努力,把deepin和win10的雙系統安裝好了。同時把jrt開發需要的svn,jdk,idea安裝好里,代碼也checkout里。 首先安裝系統碰到安裝deepin后啟動時候無法選擇win10,在宏偉兄幫助下找到資料執行sudo update-grub解決了。 然后程…

糖果促銷【百度之星】/思維

糖果促銷 思維 大佬的解法&#xff1a; #include<bits/stdc.h> using namespace std; typedef long long ll; int main() {ll t;cin>>t;for(int i0;i<t;i){ll p,k;cin>>p>>k;if(k0) cout<<0<<endl;else{k-(k-1)/p;cout<<k<…

v-for中key的作用

v-for中key的作用 例如我們用v-for渲染一個列表[1, 2, 4 ,5]&#xff0c;然后在中間插入一個3變成[1,2,3,4,5]。v-for寫了key和沒有寫key&#xff0c;Vue是怎么處理的呢&#xff1f; Vue對有key的會調用patchKeyedChildren方法&#xff1b;沒有key的調用patchUnkeyedChildren方…

Vue3 -Computed計算屬性

前言&#xff1a; Computed屬性屬于Vue3中的響應式核心(與之共同說明的還有ref&#xff0c;reactive&#xff0c;watch...) 接受一個 getter 函數&#xff0c;返回一個只讀的響應式 ref 對象。該 ref 通過 .value 暴露 getter 函數的返回值。它也可以接受一個帶有 get 和 set…

AI搜索,圍攻百度

圖片&#xff5c;電影《雙子殺手》截圖 ©自象限原創 作者丨程心 國內的大模型廠商落地C端&#xff0c;都盯上了AI搜索。 隨著5月30號&#xff0c;騰訊宣布推出基于混元大模型的APP“騰訊元寶”&#xff0c;并基于搜狗搜索引擎&#xff0c;上線AI搜索功能。幾乎當下所有…

【Qt】Qt Style Sheets (QSS) 指南:打造個性化用戶界面

文章目錄 前言&#xff1a;1. QSS 選擇器2. 子控件選擇器&#xff08;Sub-Controls&#xff09;2.1. 示例&#xff1a;給 QComboBox 給下拉按鈕加上圖標2.2. 示例&#xff1a;修改進度條顏色 3. 偽類選擇器3.1. 代碼示例: 設置按鈕的偽類樣式.3.2. 代碼示例: 使用事件方式實現同…

數模混合芯片設計中的修調技術是什么?

一、修調目的 數模混合芯片需要修調技術主要是因為以下幾個原因&#xff1a; 工藝偏差&#xff08;Process Variations&#xff09;&#xff1a; 半導體制造過程中存在不可避免的工藝偏差&#xff0c;如晶體管尺寸、閾值電壓、電阻和電容值等&#xff0c;這些參數的實際值與…

阿里云計算之linux入門命令學習筆記(三)

Linux 提供了豐富的命令行工具&#xff0c;用于系統管理、文件操作、網絡管理、進程控制等。以下是一些常用的 Linux 命令及其簡要說明&#xff1a; 切換用戶 su 命令 su (substitute user) 命令用于切換用戶。 su - username # 切換到指定用戶&#xff0c;并加載…

【學習Day5】操作系統

?&#x1f3fb;記錄學習過程中的輸出&#xff0c;堅持每天學習一點點~ ??希望能給大家提供幫助~歡迎點贊&#x1f44d;&#x1f3fb;收藏?評論?&#x1f3fb;指點&#x1f64f; 學習編輯文章的時間不太夠用&#xff0c;先放思維導圖&#xff0c;后續復習完善細節。

【C++】6-6 你好,輸出的格式控制(對齊)

6-6 你好&#xff0c;輸出的格式控制&#xff08;對齊&#xff09; 分數 10 全屏瀏覽 切換布局 作者 向訓文 單位 惠州學院 完善程序&#xff1a;按示例格式輸出所有分數&#xff0c;分數保留2位小數&#xff0c;分數左對齊輸出在兩根豎線之間 裁判測試程序樣例&#xff1…

vsto與vba的優缺點

VSTO&#xff08;Visual Studio Tools for Office&#xff09;和VBA&#xff08;Visual Basic for Applications&#xff09;都是用于擴展和定制Microsoft Office應用程序的開發工具。它們各有優缺點&#xff0c;適用于不同的場景。以下是對它們優缺點的詳細比較&#xff1a; V…

基于jeecgboot-vue3的Flowable流程-我的任務(三)

因為這個項目license問題無法開源&#xff0c;更多技術支持與服務請加入我的知識星球。 這一部分主要講我的任務里的詳情&#xff0c;看流程情況 1、主要調用record/index.vue&#xff0c;調用參數如下&#xff1a; /*** 詳情*/function handleDetail(record: Recordable) {c…

構建一個文字冒險游戲:Python 編程實戰

在本文中&#xff0c;我們將探索如何使用 Python 創建一個簡單的文字冒險游戲。通過這個項目&#xff0c;你將了解到基礎的編程技術&#xff0c;包括條件語句、函數和基本的用戶輸入處理&#xff0c;同時也能體會到文本游戲的魅力和設計的挑戰。 項目概述 文字冒險游戲是一種…