23种设计模式


一、设计模式整体概述

GoF(Gang of Four,四人帮) :指1994年联合出版《设计模式:可复用面向对象软件的基础》的四位计算机领域权威专家,四位作者及中文名分别为:Erich Gamma(埃里希·伽马)、Richard Helm(理查德·赫尔姆)、Ralph Johnson(拉尔夫·约翰逊)、John Vlissides(约翰·弗利赛德斯)。四人共同总结并定义了 23种经典面向对象设计模式,是全球软件开发通用的设计规范标准,该套设计思想适用于所有编程语言,并非Java独有。

三大核心分类

  • 创建型模式(5种) :解决 对象创建 问题,管控对象实例化过程

  • 结构型模式(7种) :解决 类/对象组合结构 问题,灵活组装对象、扩展功能

  • 行为型模式(11种) :解决 对象之间交互、职责分配、流程调度 问题


二、创建型设计模式(5种)

核心目的:统一、规范、灵活地创建对象,隔离对象创建与使用,降低耦合。

1. 单例模式(Singleton)

核心作用 :保证一个类全局只有一个实例,提供全局访问入口。

适用场景:工具类、配置类、线程池、缓存对象、日志对象。

常见实现:饿汉式、懒汉式、双重检查锁DCL、静态内部类、枚举(最优)。

代码示例(枚举最优)

java 复制代码
// 枚举单例:线程安全、防止反射破坏、防止序列化破坏
public enum Singleton {
    INSTANCE;
    public void doSomething(){
        System.out.println("执行业务逻辑");
    }
}
// 使用:Singleton.INSTANCE.doSomething();

JDK源码出处:Runtime.getRuntime()、Spring容器Bean默认单例

2. 工厂方法模式(Factory Method)

核心作用 :定义工厂抽象接口,由子类决定实例化哪个类,单一产品等级。

适用场景:同一类产品、不同具体实现,需要灵活扩展产品。

代码示例

java 复制代码
// 产品接口
interface Phone{void call();}
// 具体产品
class IPhone implements Phone{@Override public void call(){System.out.println("苹果打电话");}}
class Huawei implements Phone{@Override public void call(){System.out.println("华为打电话");}}

// 工厂抽象
interface PhoneFactory{Phone createPhone();}
// 具体工厂
class IPhoneFactory implements PhoneFactory{@Override public Phone createPhone(){return new IPhone();}}
class HuaweiFactory implements PhoneFactory{@Override public Phone createPhone(){return new Huawei();}}

JDK源码出处:java.util.Calendar、线程池ThreadPoolExecutor

3. 抽象工厂模式(Abstract Factory)

核心作用 :工厂方法升级,支持产品族、多系列产品统一创建。

适用场景:多组关联产品、成套创建场景(如操作系统按钮/弹窗组件)。

核心特点:工厂方法是「单个产品」,抽象工厂是「产品族(成套产品)」

JDK源码出处:javax.xml.parsers 解析器工厂体系

4. 建造者模式(Builder)

核心作用分步构建复杂对象,参数灵活组合,适配多参数、参数可选场景。

适用场景:实体类参数多、参数可选、链式赋值(如Lombok @Builder)。

代码示例(经典链式Builder)

java 复制代码
public class User {
    private String name;
    private Integer age;
    private String email;

    // 私有构造
    private User(Builder builder){
        this.name = builder.name;
        this.age = builder.age;
        this.email = builder.email;
    }

    public static Builder builder(){return new Builder();}

    public static class Builder{
        private String name;
        private Integer age;
        private String email;

        public Builder name(String name){this.name = name;return this;}
        public Builder age(Integer age){this.age = age;return this;}
        public Builder email(String email){this.email = email;return this;}
        public User build(){return new User(this);}
    }
}
// 使用:User user = User.builder().name("张三").age(18).build();

JDK源码出处:StringBuilder、Spring BeanDefinitionBuilder

5. 原型模式(Prototype)

核心作用 :通过对象克隆创建新对象,无需重新new,节省创建开销。

适用场景:对象创建成本高、大量相似对象、配置对象复制。

代码示例

java 复制代码
class Person implements Cloneable{
    public String name;
    @Override
    public Person clone() throws CloneNotSupportedException {
        return (Person)super.clone();
    }
}
// 使用:克隆生成新对象,不通过new
Person p1 = new Person();
Person p2 = p1.clone();

JDK源码出处:ArrayList.clone()、Object.clone()


三、结构型设计模式(7种)

核心目的:通过类继承、对象组合,灵活搭建系统结构,扩展功能、兼容适配。

1. 适配器模式(Adapter)

核心作用接口转换、兼容适配,让不兼容的接口可以协同工作。

适用场景:新旧系统兼容、第三方接口适配、接口改造兼容老代码。

代码示例

java 复制代码
// 新接口
interface NewSocket{void charge();}
// 老设备
class OldDevice{public void oldCharge(){System.out.println("老式充电");}}
// 适配器
class DeviceAdapter extends OldDevice implements NewSocket{
    @Override
    public void charge() {
        super.oldCharge();
    }
}

JDK源码出处:InputStreamReader、OutputStreamWriter

2. 装饰器模式(Decorator)

核心作用动态给对象扩展功能,不修改原类代码,多层包装。

适用场景:IO流包装、权限增强、功能叠加扩展(JDK IO经典实现)。

核心区别 :装饰器同接口、多层增强 ;适配器接口转换

JDK源码出处:BufferedReader、BufferedInputStream

3. 代理模式(Proxy)

核心作用 :通过代理对象控制原对象访问,增强前后逻辑。

分类:静态代理、JDK动态代理、CGLIB代理。

适用场景:Spring AOP、事务控制、日志记录、权限校验、延时加载。

静态代理示例

java 复制代码
interface UserService{void login();}
class UserServiceImpl implements UserService{@Override public void login(){System.out.println("登录业务");}}
// 代理类
class UserProxy implements UserService{
    private UserService target;
    public UserProxy(UserService target){this.target=target;}
    @Override
    public void login() {
        System.out.println("日志前置");
        target.login();
        System.out.println("日志后置");
    }
}

JDK源码出处:JDK动态代理Proxy、Spring AOP

4. 外观模式(Facade)

核心作用 :提供统一入口,隐藏复杂子系统细节,简化调用。

适用场景:复杂模块封装、统一接口、系统分层入口。

代码示例:对外提供一个统一入口,隐藏多个子模块

JDK源码出处:java.lang.Runtime、SpringApplicationContext

5. 桥接模式(Bridge)

核心作用分离抽象与实现,让两者独立扩展,解决多维度类爆炸问题。

适用场景:多维度变化场景(品牌+设备、颜色+形状等)。

核心作用:解决「多维度继承导致的类爆炸」

JDK源码出处:AWT、Swing 多维度组件设计

6. 组合模式(Composite)

核心作用 :统一处理单个对象与组合对象,树形结构统一操作。

适用场景:菜单树、部门组织树、文件目录结构。

核心特点 :叶子节点和容器节点统一操作

JDK源码出处:XML DOM树、文件File结构

7. 享元模式(Flyweight)

核心作用对象池复用,共享细粒度对象,减少内存占用。

适用场景:线程池、字符串常量池、Integer缓存、连接池。

核心思想:内部不变(享元)、外部可变(外部状态)

JDK源码出处:IntegerCache、String常量池、ThreadPoolExecutor


四、行为型设计模式(11种)

核心目的:规范对象间通信、职责分配、流程控制、算法替换。

1. 策略模式(Strategy)

核心作用 :定义一系列算法,算法可自由替换,消除大量if-else。

适用场景:支付方式、折扣算法、排序策略、业务分支判断。

代码示例(消灭if-else)

java 复制代码
// 策略接口
interface PayStrategy{void pay();}
// 具体策略
class AliPay implements PayStrategy{@Override public void pay(){System.out.println("支付宝支付");}}
class WechatPay implements PayStrategy{@Override public void pay(){System.out.println("微信支付");}}
// 上下文调度
class PayContext{
    private PayStrategy strategy;
    public PayContext(PayStrategy strategy){this.strategy=strategy;}
    public void executePay(){strategy.pay();}
}

JDK源码出处:Comparator、ThreadPoolExecutor拒绝策略

2. 模板方法模式(Template Method)

核心作用 :父类定义固定流程骨架,子类实现可变步骤。

适用场景:统一业务流程、框架固定执行流程(Spring源码大量使用)。

代码示例

java 复制代码
abstract class AbstractTask{
    // 固定模板流程
    public final void execute(){
        before();
        doTask();
        after();
    }
    protected void before(){System.out.println("前置通用操作");}
    protected abstract void doTask();
    protected void after(){System.out.println("后置通用操作");}
}
// 子类只实现可变逻辑
class MyTask extends AbstractTask{
    @Override
    protected void doTask() {
        System.out.println("执行具体任务");
    }
}

JDK源码出处:Spring Framework 大量模板方法、HttpServlet

3. 观察者模式(Observer)

核心作用发布-订阅机制,一对多消息通知,解耦发布者与订阅者。

适用场景:事件监听、消息推送、Spring事件机制、MQ消息消费。

核心特点:一对多、发布者与订阅者完全解耦

JDK源码出处:java.util.Observer、Spring ApplicationEvent

4. 迭代器模式(Iterator)

核心作用 :提供统一遍历接口,隐藏集合内部结构

适用场景:Java集合Iterator迭代器、统一遍历各类容器。

核心作用:统一遍历方式,屏蔽数组、链表、哈希表差异

JDK源码出处:java.util.Iterator、ListIterator

5. 责任链模式(Chain of Responsibility)

核心作用 :多个处理器链式逐级处理请求,请求可传递、可终止。

适用场景:拦截器、过滤器、权限校验、审批流程、Spring拦截器链。

代码示例

java 复制代码
// 处理器抽象
interface Handler{void handle(String request);}
// 具体处理器
class AuthHandler implements Handler{@Override public void handle(String req){System.out.println("权限校验");}}
class LogHandler implements Handler{@Override public void handle(String req){System.out.println("日志记录");}}
// 链式传递:可自由拼接、可中断

JDK源码出处:Servlet Filter、Spring Interceptor链

6. 命令模式(Command)

核心作用将请求封装为对象,支持撤销、排队、日志、重试。

适用场景:任务队列、操作撤销、定时任务、指令调度。

核心价值:把「动作」变成「对象」,可存储、可排队、可撤销

JDK源码出处:Runnable、ThreadPoolExecutor任务提交

7. 状态模式(State)

核心作用 :根据对象状态自动切换行为,消除大量状态判断if-else。

适用场景:订单状态、审批状态、游戏状态流转。

优势:彻底消除 if(状态1)、if(状态2) 烂代码

JDK源码出处:线程State状态机、Spring状态机

8. 备忘录模式(Memento)

核心作用 :保存对象历史状态,支持状态回滚、撤销操作

适用场景:文档撤销、版本回退、快照备份。

核心思想:单独保存快照,不破坏原对象

9. 访问者模式(Visitor)

核心作用分离数据结构与数据操作,不修改实体类即可新增操作。

适用场景:数据统计、报表生成、固定结构多变操作场景。

特点 :极少用、面试冷门、适合数据结构固定、操作频繁新增

10. 中介者模式(Mediator)

核心作用 :通过中介统一通信,解除多对象耦合,避免多对多依赖。

适用场景:聊天室、消息中转、多模块交互调度。

解决痛点:多对象互相依赖,网状耦合爆炸

11. 解释器模式(Interpreter)

核心作用 :定义语法规则,用于解析自定义表达式、语法

适用场景:规则引擎、表达式解析、编译器语法解析(极少业务使用)。

特点:学习成本高、业务几乎不用,仅框架底层使用


五、23种设计模式终极汇总表

分类 包含模式 核心一句话作用
创建型5种 单例、工厂方法、抽象工厂、建造者、原型 管控对象创建,解耦创建与使用
结构型7种 适配器、装饰器、代理、外观、桥接、组合、享元 组装、扩展、适配系统结构,优化架构
行为型11种 策略、模板、观察者、迭代器、责任链、命令、状态、备忘录、访问者、中介者、解释器 规范对象交互、算法、流程、状态调度

六、面试高频重点模式(必背)

面试90%会问的核心模式

  1. 单例模式:手写、线程安全、枚举优缺点

  2. 工厂模式:普通工厂、抽象工厂区别

  3. 建造者模式:实际开发应用场景

  4. 代理模式:动态代理、AOP原理

  5. 策略模式:消灭if-else实战

  6. 模板方法模式:框架源码高频

  7. 观察者模式:事件驱动原理

  8. 责任链模式:拦截器、过滤器原理


七、全文总结

  1. Java 经典设计模式共 23种,分为创建型(5)、结构型(7)、行为型(11)。

  2. 创建型 关注「对象怎么创建」,结构型 关注「代码怎么组装」,行为型关注「对象怎么交互执行」。

  3. 实际开发不用死记所有模式,重点掌握8大高频模式,可解决90%代码解耦、优化、架构设计问题。

相关推荐
xiaoshuaishuai81 小时前
C# Avaloniaui ListBox样式及用法
开发语言·c#
可可嘻嘻大老虎1 小时前
SpringBoot拦截器防重复提交实战
java·spring boot·后端
天才程序YUAN1 小时前
Windows 11 C 盘扩容完整教程:恢复分区拦路、页面文件锁盘、WinRE 重建全记录
c语言·开发语言·windows
川冰ICE1 小时前
JavaScript进阶③|Map_Set_WeakMap_WeakSet,新型数据结构
开发语言·javascript·数据结构
我是一颗柠檬1 小时前
C语言最全面复习:从入门到精通(2026年)
c语言·开发语言
RainCityLucky1 小时前
Java Swing 自定义组件库分享(十一)
java·笔记·后端
ch.ju1 小时前
Java Programming Chapter 4——The set method assigns a value to the property.
java·开发语言
Sam_Deep_Thinking1 小时前
SaaS多租户业务差异化:扩展点机制的设计与实现
java·架构
古城小栈1 小时前
Rustix库:Rust 系统编程 的 基石
开发语言·后端·rust