Java常用設(shè)計(jì)模式及應(yīng)用場景示例詳解
設(shè)計(jì)模式分為三大類:創(chuàng)建型(5種)、結(jié)構(gòu)型(7種)、行為型(11種),以下是 Java 開發(fā)中最核心、高頻使用的模式及真實(shí)場景
一、創(chuàng)建型模式(Creational Patterns)
| 模式 | 核心目的 | Java/框架中的應(yīng)用場景 |
|---|---|---|
| 單例模式 | 確保類僅有一個(gè)實(shí)例,全局訪問 | 1. Spring Bean 默認(rèn)作用域(singleton) 2. Runtime.getRuntime() 獲取 JVM 運(yùn)行時(shí) 3. 數(shù)據(jù)庫連接池(如 HikariCP 的池管理器) |
| 工廠模式 (簡單工廠/工廠方法/抽象工廠) | 封裝對象創(chuàng)建邏輯,解耦調(diào)用者與實(shí)現(xiàn) | 1. Calendar.getInstance() 創(chuàng)建日歷對象 2. JDBC DriverManager 獲取數(shù)據(jù)庫連接 3. Spring BeanFactory 創(chuàng)建和管理 Bean |
| 建造者模式 | 分步構(gòu)建復(fù)雜對象,鏈?zhǔn)秸{(diào)用 | 1. StringBuilder.append() 構(gòu)建字符串 2. Spring Security User.withDefaultPasswordEncoder() 3. Lombok @Builder 自動生成建造者 |
| 原型模式 | 通過克隆創(chuàng)建對象,避免重復(fù)初始化 | 1. Object.clone() 方法 2. JDK ArrayList 的 clone() 實(shí)現(xiàn)3. Spring Bean 的 prototype 作用域 |
二、結(jié)構(gòu)型模式(Structural Patterns)
2.1 高頻核心模式
| 模式 | 核心目的 | Java/框架中的應(yīng)用場景 |
|---|---|---|
| 代理模式 | 為對象提供代理,控制訪問或增強(qiáng)功能 | 1. Spring AOP 動態(tài)代理(JDK 動態(tài)代理/CGLIB) 2. MyBatis Mapper 接口 的代理實(shí)現(xiàn) 3. RMI 遠(yuǎn)程代理 實(shí)現(xiàn)跨 JVM 調(diào)用 |
| 裝飾器模式 | 動態(tài)為對象添加職責(zé),透明擴(kuò)展 | 1. Java IO 流(BufferedInputStream 裝飾 FileInputStream)2. Spring Cache 裝飾器 增強(qiáng)方法緩存 3. Servlet Filter 鏈 裝飾 HTTP 請求處理 |
| 適配器模式 | 轉(zhuǎn)換接口,使不兼容類協(xié)同工作 | 1. Arrays.asList() 將數(shù)組適配為 List 2. Spring MVC HandlerAdapter 適配不同 Controller 3. JPA 的 JpaVendorAdapter 適配不同數(shù)據(jù)庫 |
| 外觀模式 | 為子系統(tǒng)提供統(tǒng)一入口,簡化調(diào)用 | 1. Spring JdbcTemplate 封裝 JDBC 復(fù)雜操作 2. SLF4J 門面 統(tǒng)一日志框架(Logback/Log4j) 3. Tomcat RequestFacade 封裝 ServletRequest |
2.2 中等頻率模式
| 模式 | 核心目的 | Java/框架中的應(yīng)用場景 |
|---|---|---|
| 組合模式 | 樹形結(jié)構(gòu),統(tǒng)一處理單個(gè)對象和組合對象 | 1. Java Swing GUI 組件(Container 包含 Component) 2. JSF UIComponent 樹 3. 組織結(jié)構(gòu)樹(員工與部門統(tǒng)一接口) |
| 橋接模式 | 分離抽象與實(shí)現(xiàn),獨(dú)立擴(kuò)展 | 1. JDBC 驅(qū)動橋接(Driver 橋接不同數(shù)據(jù)庫協(xié)議) 2. Spring 的橋接模式 在 Bean 定義與實(shí)現(xiàn)間 3. AWT 的 Peer 架構(gòu)(跨平臺 GUI) |
| 享元模式 | 共享細(xì)粒度對象,節(jié)省內(nèi)存 | 1. String 字符串常量池(如 "abc" 復(fù)用)2. Integer.valueOf() 緩存 -128~127 對象 3. 數(shù)據(jù)庫連接池 復(fù)用連接對象 |
三、行為型模式(Behavioral Patterns)
3.1 高頻核心模式
| 模式 | 核心目的 | Java/框架中的應(yīng)用場景 |
|---|---|---|
| 策略模式 | 封裝算法族,運(yùn)行時(shí)動態(tài)切換 | 1. Spring Resource 策略 加載(classpath/file/url) 2. Collections.sort() 傳入 Comparator 策略 3. 支付系統(tǒng) 支持微信/支付寶/銀聯(lián)多策略 |
| 觀察者模式 | 發(fā)布-訂閱,一對多依賴通知 | 1. Java EventListener(如 ServletContextListener) 2. Spring ApplicationEvent 事件驅(qū)動(如 ContextRefreshedEvent) 3. Guava EventBus 組件解耦 |
| 模板方法模式 | 定義算法骨架,子類實(shí)現(xiàn)細(xì)節(jié) | 1. Spring JdbcTemplate 執(zhí)行流程模板 2. HttpServlet 的 service() 模板方法(doGet/doPost)3. AbstractApplicationContext 的 refresh() 模板 |
| 責(zé)任鏈模式 | 鏈?zhǔn)絺鬟f請求,松散耦合 | 1. Servlet Filter 鏈(認(rèn)證→日志→鑒權(quán)) 2. Spring Security FilterChain 安全過濾 3. Netty ChannelPipeline 責(zé)任鏈處理 IO 事件 |
| 迭代器模式 | 順序訪問聚合對象元素 | 1. Java Iterator/Iterable 接口(ArrayList.iterator())2. MyBatis Cursor 游標(biāo)迭代大數(shù)據(jù) 3. Guava FluentIterable 增強(qiáng)迭代 |
| 命令模式 | 封裝請求為對象,支持撤銷/隊(duì)列 | 1. Runnable/Callable 封裝任務(wù) 2. Spring JmsTemplate 發(fā)送消息命令 3. 撤銷/重做功能(編輯器歷史棧) |
| 狀態(tài)模式 | 對象行為隨狀態(tài)改變而改變 | 1. 線程 Thread.State 枚舉(NEW/RUNNABLE/BLOCKED) 2. 訂單狀態(tài)機(jī)(待支付→已支付→已發(fā)貨) 3. Game 角色狀態(tài)(正常/眩暈/冰凍) |
3.2 中等頻率模式
| 模式 | 核心目的 | Java/框架中的應(yīng)用場景 |
|---|---|---|
| 備忘錄模式 | 保存對象狀態(tài),支持恢復(fù) | 1. Serializable 序列化 保存對象狀態(tài) 2. Git 版本控制 保存代碼歷史 3. 游戲存檔/讀檔 |
| 中介者模式 | 封裝對象交互,降低耦合 | 1. Java Concurrency Executor 協(xié)調(diào)線程 2. Spring MVC DispatcherServlet 協(xié)調(diào) Controller/View 3. 消息隊(duì)列中間件 解耦服務(wù) |
| 訪問者模式 | 分離操作與對象結(jié)構(gòu) | 1. Java AnnotationValueVisitor 注解處理 2. 編譯器 AST 遍歷 3. 報(bào)表導(dǎo)出(同一數(shù)據(jù)導(dǎo)出 CSV/PDF/Excel) |
| 解釋器模式 | 定義語法規(guī)則,解釋執(zhí)行 | 1. Java 正則表達(dá)式 Pattern 2. Spring SpEL 表達(dá)式( #{...})3. SQL 解析器(如 Druid SQL Parser) |
四、設(shè)計(jì)模式在主流框架中的體現(xiàn)
Spring Framework
// 單例模式:Bean 默認(rèn)作用域
@Component // 默認(rèn) singleton
public class UserService { ... }
// 工廠模式:BeanFactory 創(chuàng)建 Bean
ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
UserService service = ctx.getBean(UserService.class);
// 代理模式:AOP 動態(tài)代理
@Aspect
public class LogAspect {
@Around("execution(* com.example.*.*(..))")
public Object log(ProceedingJoinPoint pjp) { ... }
}
// 模板方法:JdbcTemplate
jdbcTemplate.query("SELECT * FROM users", (rs, rowNum) -> new User(rs));
MyBatis
// 代理模式:Mapper 接口代理
public interface UserMapper {
@Select("SELECT * FROM users WHERE id = #{id}")
User selectById(Long id);
}
// MyBatis 自動生成代理實(shí)現(xiàn)類
// 建造者模式:SqlSessionFactoryBuilder
SqlSessionFactory factory = new SqlSessionFactoryBuilder()
.build(inputStream);
JDK 核心庫
// 裝飾器模式:IO 流
InputStream is = new BufferedInputStream(
new FileInputStream("file.txt")
);
// 迭代器模式:集合遍歷
List<String> list = new ArrayList<>();
Iterator<String> it = list.iterator();
// 單例模式:Runtime
Runtime runtime = Runtime.getRuntime();
runtime.exec("ls -l");
五、選型決策指南
| 場景需求 | 推薦模式 | 避免場景 |
|---|---|---|
| 全局共享資源 | 單例模式 | 頻繁創(chuàng)建銷毀 |
| 對象創(chuàng)建復(fù)雜 | 建造者/工廠模式 | 在業(yè)務(wù)代碼硬編碼 new |
| 需要?jiǎng)討B(tài)擴(kuò)展功能 | 裝飾器/代理模式 | 繼承層級過深 |
| 處理流程固定,步驟可變 | 模板方法模式 | 重復(fù)代碼 |
| 多策略切換 | 策略模式 | if-else 地獄 |
| 組件解耦/事件驅(qū)動 | 觀察者/中介者模式 | 直接依賴調(diào)用 |
| 樹形結(jié)構(gòu)管理 | 組合模式 | 遞歸處理復(fù)雜 |
| 跨接口兼容 | 適配器模式 | 修改原有代碼 |
黃金法則:優(yōu)先使用創(chuàng)建型模式解耦對象創(chuàng)建,用結(jié)構(gòu)型模式優(yōu)化代碼組織,用行為型模式提升擴(kuò)展性。在框架開發(fā)中多使用代理/裝飾器,業(yè)務(wù)開發(fā)中多使用策略/模板方法。
到此這篇關(guān)于Java常用設(shè)計(jì)模式及應(yīng)用場景的文章就介紹到這了,更多相關(guān)Java設(shè)計(jì)模式及應(yīng)用場景內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot 多數(shù)據(jù)源配置不生效遇到的坑及解決
這篇文章主要介紹了springboot 多數(shù)據(jù)源配置不生效遇到的坑及解決,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
迪米特法則_動力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了迪米特法則,迪米特法則就是一個(gè)在類創(chuàng)建方法和屬性時(shí)需要遵守的法則,有興趣的可以了解一下2017-08-08
SpringBoot整合mybatis-plus快速入門超詳細(xì)教程
mybatis-plus 是一個(gè) Mybatis 的增強(qiáng)工具,在 Mybatis 的基礎(chǔ)上只做增強(qiáng)不做改變,為簡化開發(fā)、提高效率而生,本文給大家分享SpringBoot整合mybatis-plus快速入門超詳細(xì)教程,一起看看吧2021-09-09
Springboot?如何使用BindingResult校驗(yàn)參數(shù)
這篇文章主要介紹了Springboot?如何使用BindingResult校驗(yàn)參數(shù),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01
Mybatis關(guān)聯(lián)查詢之一對多和多對一XML配置詳解
這篇文章主要介紹了Mybatis關(guān)聯(lián)查詢之一對多和多對一XML配置詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10

