2025高頻面試設計模型總結篇

文章目錄

  • 設計模型概念
  • 單例模式
  • 工廠模式
  • 策略模式
  • 責任鏈模式


設計模型概念

設計模式是前人總結的軟件設計經驗和解決問題的最佳方案,它們為我們提供了一套可復用、易維護、可擴展的設計思路。

(1)定義: 設計模式是一套經過驗證的解決特定設計問題的模板,這些模板并不是代碼,而是對類、對象以及它們之間如何協作的抽象描述。

(2)目的: 降低系統的耦合性、提高代碼的復用性和可維護性,以及應對不斷變化的需求。

(3)設計模式主要可以分為三大類:創建型、結構型和行為型。以下是一些在 JAVA 開發工程師面試中常見的設計模式:

1. 創建型模式

  • 單例模式(Singleton Pattern)
    • 定義: 確保一個類只有一個實例,并提供一個全局訪問點。
    • 使用場景: 當系統中需要唯一一個對象來協調各部分工作,如配置管理、線程池、日志對象等。
  • 工廠模式(Factory Pattern)
    • 定義: 定義一個用于創建對象的接口,由子類決定實例化哪一個類。
    • 使用場景: 當系統中有大量對象創建需求,且對象之間具有共同接口或父類時,可以使用工廠模式封裝對象的創建邏輯,降低耦合。
  • 建造者模式(Builder Pattern)
    • 定義: 將一個復雜對象的構建過程與它的表示分離,使得同樣的構建過程可以創建不同的表示。
    • 使用場景: 當一個對象的構造過程復雜,涉及多個步驟或多個可選參數時,使用建造者模式能讓代碼更清晰、更易擴展。

2. 結構型模式

  • 適配器模式(Adapter Pattern)
    • 定義: 將一個類的接口轉換成客戶期望的另一個接口,使得原本因接口不兼容而不能一起工作的類可以協同工作。
    • 使用場景: 當你想要使用一些現有的類,但它們的接口與當前系統不匹配時,可以使用適配器模式。
  • 裝飾器模式(Decorator Pattern)
    • 定義: 動態地給一個對象添加一些額外的職責,而不影響其他對象。
    • 使用場景: 當系統需要在不改變原有對象結構的情況下增加功能時,裝飾器模式提供了一種靈活的解決方案。
  • 外觀模式(Facade Pattern)
    • 定義: 為復雜的子系統提供一個簡單的接口,使得客戶端可以更容易地使用子系統。
    • 使用場景: 當系統中存在多個相互依賴的類或接口時,通過外觀模式可以將復雜性隱藏起來,提供一個統一的接口。

3. 行為型模式

  • 觀察者模式(Observer Pattern)
    • 定義: 定義對象間的一種一對多的依賴關系,當一個對象的狀態發生改變時,其相關依賴對象會收到通知并自動更新。
    • 使用場景: 當一個對象狀態的變化需要通知其他對象,且不知道這些對象的數量或具體類型時,可以使用觀察者模式,如事件監聽機制。
  • 策略模式(Strategy Pattern)
    • 定義: 定義一系列算法,把它們一個個封裝起來,并使它們可以互換。
    • 使用場景: 當系統中存在多種算法或行為,并且需要根據具體情況選擇不同的算法時,策略模式能使算法切換更為靈活。
  • 模板方法模式(Template Method Pattern)
    • 定義: 在一個方法中定義一個算法的骨架,將某些步驟延遲到子類中實現,從而使子類可以不改變算法結構的情況下重新定義算法的某些步驟。
    • 使用場景: 當多個子類有很多相同的行為,只在細節上略有不同的情況下,模板方法模式可以復用公共代碼,同時讓子類實現具體差異部分。
  • 代理模式(Proxy Pattern)
    • 定義: 為其他對象提供一種代理以控制對這個對象的訪問。
    • 使用場景: 當你需要在訪問對象時附加一些額外操作(如懶加載、安全控制、緩存等)時,可以使用代理模式來控制對象的訪問。

單例模式

確保一個類只有一個實例,并提供一個全局訪問點。
Spring 框架中,默認 bean 的作用域為單例(singleton),即在整個應用上下文中只存在一個實例。
如 Spring 的 ApplicationContext 在加載 bean 時會確保同一個 bean 只被實例化一次(除非配置為其他作用域)。

public class Singleton {// 餓漢式單例private static volatile Singleton instance = null;// 私有構造方法,防止外部實例化private Singleton() {}public static Singleton getInstance() {if (instance == null) {sychronized(Singleton.class) {if (instance == null) {instance = new Singleton();}}}return instance;}
}

工廠模式

定義一個用于創建對象的接口,由子類決定實例化哪一個類。
Spring 的 BeanFactoryApplicationContext 實際上就是一個工廠,通過配置文件或注解來實例化并管理對象。

FactoryBean 接口允許開發者自定義 bean 的創建邏輯。

// 定義產品接口
public interface Product {void use();
}// 具體產品A
public class ConcreteProductA implements Product {@Overridepublic void use() {System.out.println("使用產品A");}
}// 具體產品B
public class ConcreteProductB implements Product {@Overridepublic void use() {System.out.println("使用產品B");}
}// 工廠類
public class ProductFactory {public static Product createProduct(String type) {if ("A".equals(type)) {return new ConcreteProductA();} else if ("B".equals(type)) {return new ConcreteProductB();}throw new IllegalArgumentException("未知產品類型:" + type);}
}// 測試入口
public class FactoryDemo {public static void main(String[] args) {Product productA = ProductFactory.createProduct("A");productA.use();Product productB = ProductFactory.createProduct("B");productB.use();}
}

策略模式

定義一系列算法,把它們一個個封裝起來,并使它們可以互換。
當系統中有多種算法或行為需要在運行時動態切換時,可以使用策略模式。

Spring MVC 中,通過 HandlerAdapter 接口支持多種類型的控制器(如 @Controller@RestController 等),根據實際請求選擇合適的適配器來處理業務邏輯。
事務管理、緩存策略等也采用了類似思想,通過接口和多種實現來動態選擇行為。

// 策略接口
public interface Strategy {void execute();
}// 具體策略A
public class ConcreteStrategyA implements Strategy {@Overridepublic void execute() {System.out.println("執行策略A");}
}// 具體策略B
public class ConcreteStrategyB implements Strategy {@Overridepublic void execute() {System.out.println("執行策略B");}
}// 上下文,使用策略
public class Context {private Strategy strategy;public Context(Strategy strategy) {this.strategy = strategy;}public void executeStrategy() {strategy.execute();}
}// 測試入口
public class StrategyDemo {public static void main(String[] args) {Context contextA = new Context(new ConcreteStrategyA());contextA.executeStrategy();Context contextB = new Context(new ConcreteStrategyB());contextB.executeStrategy();}
}

責任鏈模式

將請求的處理對象連成一條鏈,每個處理者持有對下一個處理者的引用,按順序處理請求或將其傳遞給下一個處理者。
當一個請求可能由多個對象處理,但不清楚到底由哪一個對象處理時,可采用責任鏈模式進行動態分派。

在 Spring Security 中,FilterChainProxy 維護了一系列過濾器(Filter),每個過濾器依次處理 HTTP 請求,決定是否放行、拒絕或進一步處理。

Spring MVC 中的攔截器鏈(HandlerInterceptor)也是一個責任鏈,每個攔截器按順序處理請求的預處理和后處理工作。

// 責任鏈中的抽象處理者
public abstract class Handler {protected Handler next;// 設置下一個處理者public void setNext(Handler next) {this.next = next;}// 處理請求public abstract void handleRequest(String request);
}// 具體處理者A
public class ConcreteHandlerA extends Handler {@Overridepublic void handleRequest(String request) {if (request.contains("A")) {System.out.println("ConcreteHandlerA 處理請求: " + request);} else if (next != null) {next.handleRequest(request);}}
}// 具體處理者B
public class ConcreteHandlerB extends Handler {@Overridepublic void handleRequest(String request) {if (request.contains("B")) {System.out.println("ConcreteHandlerB 處理請求: " + request);} else if (next != null) {next.handleRequest(request);}}
}// 測試責任鏈模式
public class ChainDemo {public static void main(String[] args) {Handler handlerA = new ConcreteHandlerA();Handler handlerB = new ConcreteHandlerB();// 設置責任鏈順序handlerA.setNext(handlerB);// 測試請求:包含 "B" 的請求由 ConcreteHandlerB 處理handlerA.handleRequest("Request with B");// 測試請求:包含 "A" 的請求由 ConcreteHandlerA 處理handlerA.handleRequest("Request with A");}
}

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

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

相關文章

Java基礎:面向對象進階(二)

01-static static修飾成員方法 static注意事項(3種) static應用知識:代碼塊 static應用知識:單列模式 02-面向對象三大特征之二:繼承 什么是繼承? 使用繼承有啥好處? 權限修飾符 單繼承、Object類 方法重…

Spring框架如何做EhCache緩存?

在Spring框架中,緩存是一種常見的優化手段,用于減少對數據庫或其他資源的訪問次數,從而提高應用性能。Spring提供了強大的緩存抽象,支持多種緩存實現(如EhCache、Redis、Caffeine等),并可以通過…

NVIDIA顯卡

NVIDIA顯卡作為全球GPU技術的標桿,其產品線覆蓋消費級、專業級、數據中心、移動計算等多個領域,技術迭代貫穿架構創新、AI加速、光線追蹤等核心方向。以下從技術演進、產品矩陣、核心技術、生態布局四個維度展開深度解析: 一、技術演進&…

【BUG】生產環境死鎖問題定位排查解決全過程

目錄 生產環境死鎖問題定位排查解決過程0. 表面現象1. 問題分析(1)數據庫連接池資源耗盡(2)數據庫鎖競爭(3) 代碼實現問題 2. 分析解決(0) 分析過程(1)優化數據庫連接池配置(2)優化數…

【計算機網絡應用層】

文章目錄 計算機網絡應用層詳解一、前言二、應用層的功能三、常見的應用層協議1. HTTP/HTTPS(超文本傳輸協議)2. DNS(域名系統)3. FTP(文件傳輸協議)4. SMTP/POP3/IMAP(電子郵件協議&#xff09…

Linux 虛擬化方案

一、Linux 虛擬化技術分類 1. 全虛擬化 (Full Virtualization) 特點:Guest OS 無需修改,完全模擬硬件 代表技術: KVM (Kernel-based Virtual Machine):主流方案,集成到 Linux 內核 QEMU:硬件模擬器&…

樹莓派 5 換清華源

首先備份原設置 cp /etc/apt/sources.list ~/sources.list.bak cp /etc/apt/sources.list.d/raspi.list ~/raspi.list.bak修改配置 /etc/apt/sources.list 文件替換內容如下(原內容刪除) deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm …

WGAN原理及實現(pytorch版)

WGAN原理及實現 一、WGAN原理1.1 原始GAN的缺陷1.2 Wasserstein距離的引入1.3 Kantorovich-Rubinstein對偶1.4 WGAN的優化目標1.4 數學推導步驟1.5 權重裁剪 vs 梯度懲罰1.6 優勢1.7 總結 二、WGAN實現2.1 導包2.2 數據加載和處理2.3 構建生成器2.4 構建判別器2.5 訓練和保存模…

Unity網絡開發基礎 (3) Socket入門 TCP同步連接 與 簡單封裝練習

本文章不作任何商業用途 僅作學習與交流 教程來自Unity唐老獅 關于練習題部分是我觀看教程之后自己實現 所以和老師寫法可能不太一樣 唐老師說掌握其基本思路即可,因為前端程序一般不需要去寫后端邏輯 1.認識Socket的重要API Socket是什么 Socket(套接字&#xff0…

【linux】一文掌握 ssh和scp 指令的詳細用法(ssh和scp 備忘速查)

文章目錄 入門連接執行SCP配置位置SCP 選項配置示例ProxyJumpssh-copy-id SSH keygenssh-keygen產生鑰匙類型known_hosts密鑰格式 此快速參考備忘單提供了使用 SSH 的各種方法。 參考: OpenSSH 配置文件示例 (cyberciti.biz)ssh_config (linux.die.net) 入門 連…

真實筆試題

文章目錄 線程題樹的深度遍歷 線程題 實現一個類支持100個線程同時向一個銀行賬戶中存入一元錢.需通過同步機制消除競態條件,當所有線程執行完成后,賬戶余額必須精確等于100元 package com.itheima.thread;public class ShowMeBug {private double balance; // 賬戶余額priva…

2.2 路徑問題專題:LeetCode 63. 不同路徑 II

動態規劃解決LeetCode 63題:不同路徑 II(含障礙物) 1. 題目鏈接 LeetCode 63. 不同路徑 II 2. 題目描述 一個機器人位于 m x n 網格的左上角,每次只能向右或向下移動一步。網格中可能存在障礙物(標記為 1&#xff…

2874. 有序三元組中的最大值 II

給你一個下標從 0 開始的整數數組 。nums 請你從所有滿足 的下標三元組 中&#xff0c;找出并返回下標三元組的最大值。 如果所有滿足條件的三元組的值都是負數&#xff0c;則返回 。i < j < k(i, j, k)0 下標三元組 的值等于 。(i, j, k)(nums[i] - nums[j]) * nums[k…

【論文筆記】Llama 3 技術報告

Llama 3中的頂級模型是一個擁有4050億參數的密集Transformer模型&#xff0c;并且它的上下文窗口長度可以達到128,000個tokens。這意味著它能夠處理非常長的文本&#xff0c;記住和理解更多的信息。Llama 3.1的論文長達92頁&#xff0c;詳細描述了模型的開發階段、優化策略、模…

JVM深入原理(一+二):JVM概述和JVM功能

目錄 1. JVM概述 1.1. Java程序結構 1.2. JVM作用 1.3. JVM規范和實現 2. JVM功能 2.1. 功能-編譯和運行 2.2. 功能-內存管理 2.3. 功能-即時編譯 1. JVM概述 1.1. Java程序結構 1.2. JVM作用 JVM全稱是Java Virtual Machine-Java虛擬機 JVM作用:本質上是一個運行在…

SQL Server Integration Services (SSIS) 服務無法啟動

問題現象&#xff1a; 安裝 SQL Server 2022 后&#xff0c;SQL Server Integration Services (SSIS) 服務無法啟動&#xff0c;日志報錯 “服務無法響應控制請求”&#xff08;錯誤代碼 1067&#xff09;或 “依賴服務不存在或已標記為刪除”。 快速診斷 檢查服務狀態與依賴項…

Spring Boot 定時任務的多種實現方式

&#x1f31f; 前言 歡迎來到我的技術小宇宙&#xff01;&#x1f30c; 這里不僅是我記錄技術點滴的后花園&#xff0c;也是我分享學習心得和項目經驗的樂園。&#x1f4da; 無論你是技術小白還是資深大牛&#xff0c;這里總有一些內容能觸動你的好奇心。&#x1f50d; &#x…

Java基礎之反射的基本使用

簡介 在運行狀態中&#xff0c;對于任意一個類&#xff0c;都能夠知道這個類的所有屬性和方法&#xff1b;對于任意一個對象&#xff0c;都能夠調用它的任意屬性和方法&#xff1b;這種動態獲取信息以及動態調用對象方法的功能稱為Java語言的反射機制。反射讓Java成為了一門動…

AI產品的上層建筑:提示詞工程、RAG與Agent

上節課我們拆解了 AI 產品的基礎設施建設&#xff0c;這節課我們聊聊上層建筑。這部分是產品經理日常工作的重頭戲&#xff0c;包含提示詞、RAG 和 Agent 構建。 用 AI 客服產品舉例&#xff0c;這三者的作用是這樣的&#xff1a; 提示詞能讓客服很有禮貌。比如它會說&#x…

藍橋杯刷題記錄【并查集001】(2024)

主要內容&#xff1a;并查集 并查集 并查集的題目感覺大部分都是模板題&#xff0c;上板子&#xff01;&#xff01; class UnionFind:def __init__(self, n):self.pa list(range(n))self.size [1]*n self.cnt ndef find(self, x):if self.pa[x] ! x:self.pa[x] self.fi…