工作中用到過哪些設計模式?是怎么實現的?

1. 單例模式(結合 Spring @Component)

場景:配置中心、全局狀態管理
Spring 實現

java

// 自動注冊為Spring Bean(默認單例)
@Component
public class AppConfig {@Value("${server.port}")private int port;// 其他配置屬性和方法
}// 使用方式(依賴注入)
@Service
public class UserService {@Autowiredprivate AppConfig appConfig;public void startServer() {System.out.println("啟動服務器,端口:" + appConfig.getPort());}
}

面試話術
“在微服務項目中,我們用@Component注解將配置類聲明為 Spring Bean,默認就是單例模式。比如 AppConfig 類統一管理應用配置,通過@Value注入配置值,所有需要使用配置的服務直接@Autowired即可。Spring 容器幫我們保證了全局唯一實例,無需手動實現雙重檢查鎖,代碼更簡潔。”

2. 工廠模式(結合 Spring FactoryBean)

場景:動態創建不同類型的數據源、Feign 客戶端
Spring 實現

java

// 數據源工廠(簡化示例)
@Configuration
public class DataSourceConfig {@Beanpublic FactoryBean<DataSource> dataSourceFactory() {return new DynamicDataSourceFactory();}
}// 自定義FactoryBean
public class DynamicDataSourceFactory implements FactoryBean<DataSource> {@Overridepublic DataSource getObject() {// 根據條件創建不同數據源(如主從庫)return DataSourceBuilder.create().url("jdbc:mysql://localhost:3306/mydb").username("root").password("password").build();}@Overridepublic Class<?> getObjectType() {return DataSource.class;}
}// 使用方式
@Service
public class DataService {@Autowiredprivate DataSource dataSource;
}

面試話術
“在分庫分表場景中,我們用FactoryBean接口實現動態數據源創建。比如根據租戶 ID 選擇主庫或從庫,通過自定義DynamicDataSourceFactory,Spring 會自動調用getObject()方法獲取數據源實例。這種方式比傳統工廠模式更優雅,與 Spring 的依賴注入體系無縫集成。”

3. 策略模式(結合 @Autowired+Map)

場景:支付方式、限流策略選擇
Spring 實現

java

// 支付策略接口
public interface PaymentStrategy {void pay(BigDecimal amount);
}// 支付寶策略
@Service("alipay")
public class AlipayStrategy implements PaymentStrategy {@Overridepublic void pay(BigDecimal amount) {System.out.println("支付寶支付:" + amount);}
}// 微信支付策略
@Service("wechatpay")
public class WechatPayStrategy implements PaymentStrategy {@Overridepublic void pay(BigDecimal amount) {System.out.println("微信支付:" + amount);}
}// 策略上下文(自動注入所有實現類)
@Service
public class PaymentService {@Autowiredprivate Map<String, PaymentStrategy> strategyMap;public void processPayment(String paymentType, BigDecimal amount) {PaymentStrategy strategy = strategyMap.get(paymentType);if (strategy != null) {strategy.pay(amount);} else {throw new IllegalArgumentException("不支持的支付類型");}}
}

面試話術
“在支付模塊中,我們用策略模式結合 Spring 的自動注入特性。每種支付方式實現PaymentStrategy接口并標記@Service,通過@Autowired Map<String, PaymentStrategy>可以自動收集所有策略實現類,Key 為 Bean 名稱(如alipay)。這種方式避免了傳統策略模式中的大量if-else,新增支付方式只需添加實現類,無需修改原有代碼。”

4. 觀察者模式(結合 Spring 事件機制)

場景:訂單狀態變更通知、異步事件處理
Spring 實現

java

// 定義事件
public class OrderPaidEvent extends ApplicationEvent {private final String orderId;public OrderPaidEvent(Object source, String orderId) {super(source);this.orderId = orderId;}public String getOrderId() {return orderId;}
}// 發布事件
@Service
public class OrderService {@Autowiredprivate ApplicationEventPublisher eventPublisher;public void payOrder(String orderId) {// 處理支付邏輯eventPublisher.publishEvent(new OrderPaidEvent(this, orderId));}
}// 監聽事件(方式1:實現ApplicationListener)
@Component
public class SmsNotificationListener implements ApplicationListener<OrderPaidEvent> {@Overridepublic void onApplicationEvent(OrderPaidEvent event) {System.out.println("發送短信通知:訂單" + event.getOrderId() + "已支付");}
}// 監聽事件(方式2:@EventListener注解)
@Component
public class LoggingListener {@EventListenerpublic void handleOrderPaid(OrderPaidEvent event) {System.out.println("記錄日志:訂單" + event.getOrderId() + "已支付");}
}

面試話術
“在訂單系統中,我們用 Spring 的事件機制替代傳統觀察者模式。當訂單支付成功后,通過ApplicationEventPublisher發布OrderPaidEvent,短信通知和日志記錄組件分別用@EventListener注解監聽該事件。這種方式比手動維護觀察者列表更靈活,支持異步處理(通過@Async注解),而且與 Spring 生態深度集成,例如可以結合事務實現事件的可靠發布。”

5. 裝飾器模式(結合 Spring AOP)

場景:權限校驗、日志增強、緩存切面
Spring 實現

java

// 定義切面
@Aspect
@Component
public class LoggingAspect {@Around("execution(* com.example.service.*.*(..))")public Object logMethod(ProceedingJoinPoint joinPoint) throws Throwable {System.out.println("方法開始:" + joinPoint.getSignature().getName());long startTime = System.currentTimeMillis();Object result = joinPoint.proceed(); // 執行原方法long endTime = System.currentTimeMillis();System.out.println("方法結束:" + joinPoint.getSignature().getName() + ",耗時:" + (endTime - startTime) + "ms");return result;}
}

面試話術
“在性能監控場景中,我們用 Spring AOP 實現裝飾器模式。通過@Around注解定義切面,在方法執行前后添加日志記錄和耗時統計邏輯,無需修改原有業務代碼。這種方式比傳統繼承或組合更靈活,可以動態控制哪些方法需要增強,而且支持切入點表達式精確匹配目標方法。”

面試應答技巧

  1. 突出框架整合:強調如何利用 Spring 特性(如依賴注入、事件機制、AOP)簡化設計模式實現,而非手動編碼。
  2. 結合業務場景:舉例說明在微服務、分布式系統中的應用(如 Feign 客戶端工廠、Sentinel 限流策略)。
  3. 對比傳統方式:指出相比 “手搓” 設計模式,Spring 提供的方案更優雅、更符合開閉原則。

例如:

“在我們的微服務項目中,服務間通信使用 Feign 客戶端。當需要根據環境動態切換服務 URL 時,我們實現了FeignClientFactoryBean,利用 Spring 的工廠機制和配置中心(Nacos),根據不同環境加載不同的服務地址。這種方式比硬編碼 URL 更靈活,符合工廠模式的思想,同時充分利用了 Spring 的生態優勢。”

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

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

相關文章

Leetcode 3609. Minimum Moves to Reach Target in Grid

Leetcode 3609. Minimum Moves to Reach Target in Grid 1. 解題思路2. 代碼實現 題目鏈接&#xff1a;3609. Minimum Moves to Reach Target in Grid 1. 解題思路 這一題我一開始走岔了&#xff0c;走了一個正向遍歷走法的思路&#xff0c;無論怎么剪枝都一直超時。后來看了…

工作流引擎:IDEA沒有actiBPMN插件怎么辦?

文章目錄一、問題描述二、替代方案一、問題描述 我們在學習activiti7工作流引擎的時候&#xff0c;需要設計流程圖。 一般推薦的就是使用IDEA插件actiBPMN進行開發。 但是&#xff0c;這個插件在IDEA2019后的版本都不在支持。 也就是搜不到 那么&#xff0c;怎么辦了&#x…

Android音視頻探索之旅 | CMake基礎語法 創建支持Ffmpeg的Android項目

一.CMake語法 CMake語法非常多&#xff0c;我們知道如何導入靜態庫和動態庫以及最基礎的使用&#xff0c;目前是夠用的。其它方面則根據實際項目同步學習。 1.1.基礎語法-常用 cmake_minimum_required&#xff1a;指定cmake最小版本include_directories&#xff1a;引入&#x…

React Native 初始化項目和模擬器運行

中文官方文檔&#xff1a;https://reactnative.cn/docs/environment-setup 英文官方文檔&#xff1a;https://reactnative.dev/docs/getting-started-without-a-framework#step-1-creating-a-new-application 創建新項目 1、初始化 # 如果你之前全局安裝過舊的react-native-cli…

20250706-5-Docker 快速入門(上)-創建容器常用選項_筆記

一、創建容器常用選項&#xfeff;&#xfeff;1. 創建容器常用選項&#xfeff;1&#xff09;常用選項創建容器常用選項&#xfeff;交互式選項&#xff1a;-i&#xff1a;保持標準輸入打開&#xff0c;允許交互式操作-t&#xff1a;分配偽終端&#xff0c;使容器像傳統終端一…

插值與擬合(3):B樣條曲線

在路徑規劃問題中&#xff0c;通常會用到B樣條來平滑路徑&#xff0c;本文實現并封裝了三次準均勻開放B樣條曲線&#xff0c;供大學學習使用。作者提供了三套代碼方案。可以用于不同平臺&#xff1a;方案1&#xff1a;MATLAB&#xff1b;方案2&#xff1a;標準C&#xff1b;方案…

[免費]基于Python豆瓣電影數據分析及可視化系統(Flask+echarts+pandas)【論文+源碼+SQL腳本】

大家好&#xff0c;我是java1234_小鋒老師&#xff0c;看到一個不錯的于Python豆瓣電影數據分析及可視化系統(Flaskechartpandas)【論文源碼SQL腳本】&#xff0c;分享下哈。項目介紹隨著如今電影越來越多&#xff0c;各種各樣的爛片和撈錢的商業片也層出不窮&#xff0c;而有意…

SQL127 月總刷題數和日均刷題數

SQL127 月總刷題數和日均刷題數 withtemp as (selectDATE_FORMAT(submit_time, "%Y%m") as submit_month,count(question_id) as month_q_cnt,round(count(question_id) / day(last_day(max(submit_time))),3) as avg_day_q_cntfrompractice_recordwhereyear(submit…

unity luban接入

1.找到luban官網并下載他的例子和.net8.0的sdk安裝 官網地址如下 快速上手 | Luban 參考大佬教程如下 Luban新版本接入教程_嗶哩嗶哩_bilibili 2.找到他的luban_examples-main示例下的兩個文件MiniTemplate和tool 3.MiniTemplate這個文件復制一份到項目工程下&#xff0c;自…

Django服務開發鏡像構建

最后完整的項目目錄結構1、安裝依賴pip install django django-tables2 django-filter2、創建項目和主應用django-admin startproject configcd configpython manage.py startapp dynamic_models3、配置settings.py將項目模塊dynamic_models加入進來&#xff0c;django_tables2…

20250706-3-Docker 快速入門(上)-常用鏡像管理命令_筆記

一、配置加速器&#xfeff;1. Docker Hub簡介與地址&#xfeff;公共鏡像倉庫: 由Docker公司維護的公共鏡像倉庫&#xff0c;包含大量容器鏡像默認下載源: Docker工具默認從這個公共鏡像庫下載鏡像訪問地址: https://hub.docker.com鏡像搜索功能: 可通過瀏覽器訪問圖形化管理系…

【unity游戲開發——優化篇】使用Occlusion Culling遮擋剔除,只渲染相機視野內的游戲物體提升游戲性能

注意&#xff1a;考慮到優化的內容比較多&#xff0c;我將該內容分開&#xff0c;并全部整合放在【unity游戲開發——優化篇】專欄里&#xff0c;感興趣的小伙伴可以前往逐一查看學習。 文章目錄 前言實戰1、確保所有靜止的3D物體都標記為Occluder Static靜態遮擋體和Occludee …

通用業務編號生成工具類(MyBatis-Plus + Spring Boot)詳解 + 3種調用方式

在企業應用開發中&#xff0c;我們經常需要生成類似 BZ -240704-0001 這種“業務編號”&#xff0c;它通常具有以下特點&#xff1a;前綴&#xff1a;代表業務類型&#xff0c;如 BZ 表示包裝日期&#xff1a;年月日格式&#xff0c;通常為 yyMMdd序列號&#xff1a;當天內遞增…

前端相關性能優化筆記

1.打開速度怎么變快 - 首屏加載優化2.再次打開速度怎么變快 - 緩存優化了3.操作怎么才順滑 - 渲染優化4.動畫怎么保證流暢 - 長任務拆分2.1 首屏加載指標細化:1.FP(First Paint 首次繪制) 2.FCP(First contentful Paint 首次內容繪制)&#xff0c;FP 到 FCP 中間其實主要是 SPA…

7.7晚自習作業

實操作業02&#xff1a;Spark核心開發 作業說明 請嚴格按照步驟操作&#xff0c;并將最終結果文件&#xff08;命名為&#xff1a;sparkcore_result.txt&#xff09;于20點前上傳。結果文件需包含每一步的關鍵命令執行結果文本輸出。 一、數據讀取與轉換操作 上傳賬戶數據$…

手機FunASR識別SIM卡通話占用內存和運行性能分析

手機FunASR識別SIM卡通話占用內存和運行性能分析 --本地AI電話機器人 上一篇&#xff1a;手機無網離線使用FunASR識別SIM卡語音通話內容 下一篇&#xff1a;手機通話語音離線ASR識別商用和優化方向 一、前言 書接上一文《阿里FunASR本地斷網離線識別模型簡析》&#xff0c;…

虛幻引擎Unreal Engine5恐怖游戲設計制作教程,從入門到精通從零開始完整項目開發實戰詳細講解中英字幕

和大家分享一個以前收集的UE5虛幻引擎恐怖游戲開發教程&#xff0c;這是國外一個大神制作的視頻教程&#xff0c;教程從零開始到制作出一款完整的游戲。內容講解全面&#xff0c;如藍圖基礎知識講解、角色控制、高級交互系統、高級庫存系統、物品檢查、恐怖環境氛圍設計、過場動…

多人協同開發時Git使用命令

拉取倉庫代碼 # 拉取遠程倉庫至本地tar_dir路徑 git clone gitgithub.com:your-repo.git target_dir # 默認是拉取遠程master分支&#xff0c;下面拉取并切換到自己需要開發的分支上 # 假設自己需要開發的分支是/feature/my_branch分支 git checkout -b feature/my_branch orig…

線性表——雙向鏈表

線性表——雙向鏈表1. 雙向鏈表的實現1.1 簡單圖例1.2 結點的定義1.3 新結點的創建1.4 鏈表的初始化1.5 結點的插入1.5.1 頭部插入&#xff08;頭插&#xff09;1.5.2 尾部插入&#xff08;尾插&#xff09;1.5.3 任意位置&#xff08;前&#xff09;插入1.6 結點的刪除1.6.1 頭…

Java后端技術博客匯總文檔

文章目錄 前言Java后端匯總鏈接Java基礎知識點數據結構算法&#xff08;Java實現&#xff09;算法知識點合集算法刷題算法競賽AcWing課程藍橋杯AB組輔導課合集&#xff08;更新中…&#xff09; 源碼分析redission 數據庫SQL ServerMySQLRedis -Canal JUC并發編程JVMNetty日志框…