news 2026/6/10 9:46:26

23种设计模式精讲:从入门到精通,一文掌握设计模式核心思想

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
23种设计模式精讲:从入门到精通,一文掌握设计模式核心思想

面试中经常被问到设计模式?项目中不知道如何应用设计模式优化代码?面对复杂系统设计感到无从下手?本文全面讲解23种GoF设计模式,包括6大设计原则5种创建型模式7种结构型模式11种行为型模式,结合UML类图、源码解析和实战案例,助你成为架构设计高手,轻松应对大厂面试!


📋 文章目录

  • 一、设计模式概述
    • 1.1 代码质量评价标准
    • 1.2 编程方法论
    • 1.3 设计模式分类
  • 二、UML类图
  • 三、六大设计原则(SOLID)
  • 四、创建型模式(5种)
    • 4.1 单例模式
    • 4.2 工厂方法模式
    • 4.3 抽象工厂模式
    • 4.4 建造者模式
    • 4.5 原型模式
  • 五、结构型模式(7种)
    • 5.1 代理模式
    • 5.2 桥接模式
    • 5.3 装饰者模式
    • 5.4 适配器模式
    • 5.5 门面模式
    • 5.6 组合模式
    • 5.7 享元模式
  • 六、行为型模式(11种)
  • 七、设计模式速查表

一、设计模式概述

1.1 代码质量评价标准

设计模式的目标:提高代码质量,写出可维护、可扩展、可读性强的高质量代码。

评价标准说明重要性
可维护性不破坏原有设计、不引入新Bug的前提下快速修改代码⭐⭐⭐⭐⭐
可读性代码易于理解和审查(Code Review)⭐⭐⭐⭐⭐
可扩展性对修改关闭,对扩展开放⭐⭐⭐⭐⭐
灵活性代码能够灵活接纳新功能⭐⭐⭐⭐
简洁性遵循KISS原则,简单优雅⭐⭐⭐⭐
可复用性减少重复代码,DRY原则⭐⭐⭐⭐
可测试性易于编写单元测试⭐⭐⭐⭐

1.2 编程方法论

提升代码质量的完整体系

面向对象设计(基础) ↓ 设计原则(指导思想) ↓ 设计模式(原则的具体实现) ↓ 编程规范(提高可读性) ↓ 重构技巧(持续优化)

六大设计原则(SOLID)

原则英文缩写核心思想
单一职责原则SRP一个类只负责一个职责
开闭原则OCP对扩展开放,对修改关闭
里氏替换原则LSP子类可以替换父类
接口隔离原则ISP接口要小而专
依赖倒置原则DIP依赖抽象而非具体实现
迪米特法则LoD最少知识原则

1.3 设计模式分类

GoF(Gang of Four)23种设计模式分为三大类:

类型数量常用模式
创建型模式5种单例、工厂方法、抽象工厂、建造者
结构型模式7种代理、装饰者、适配器、桥接
行为型模式11种观察者、策略、模板、职责链

二、UML类图

2.1 类图表示法

符号含义Java对应
+public公共访问
-private私有访问
#protected受保护访问

2.2 类之间的关系

关系图示代码示例耦合度
实现虚线+空心三角implements
泛化(继承)实线+空心三角extends
关联实线+箭头成员变量
聚合实线+空心菱形构造器传入
组合实线+实心菱形内部创建
依赖虚线+箭头方法参数

编程建议:多用组合,少用继承


三、六大设计原则(SOLID)

3.1 单一职责原则(SRP)

定义:一个类或模块只负责完成一个职责。

核心思想:不要设计大而全的类,要设计粒度小、功能单一的类。

判断标准

  • 类中的代码行数、函数过多
  • 类依赖的其他类过多
  • 私有方法过多
  • 大量方法集中操作几个属性

3.2 开闭原则(OCP)⭐最重要

定义:对扩展开放,对修改关闭。

实现方式

  1. 通过接口或抽象类定义稳定的行为
  2. 通过具体实现类来扩展功能

示例

// 抽象接口 - 稳定publicinterfaceIStrategy{doublerealPrice(doubleconsumePrice);}// 具体实现 - 可扩展publicclassPromotionalStrategyimplementsIStrategy{publicdoublerealPrice(doubleconsumePrice){if(consumePrice>200){return200+(consumePrice-200)*0.8;}returnconsumePrice;}}publicclassRebateStrategyimplementsIStrategy{publicdoublerealPrice(doubleconsumePrice){returnconsumePrice*0.8;}}

3.3 里氏替换原则(LSP)

定义:子类对象能够替换程序中父类对象出现的任何地方,并且保证程序逻辑行为不变。

核心:子类可以扩展父类功能,但不能改变父类原有功能。

3.4 接口隔离原则(ISP)

定义:客户端不应该被迫依赖于它不使用的方法。

与单一职责原则的区别

  • 单一职责原则约束的是
  • 接口隔离原则约束的是接口

3.5 依赖倒置原则(DIP)

定义

  1. 高层模块不应该依赖低层模块,两者都应该依赖抽象
  2. 抽象不应该依赖细节,细节应该依赖抽象

实现方式:面向接口编程

3.6 迪米特法则(LoD)

定义:最少知识原则,talk only to your immediate friends(只和你最亲密的朋友交谈)。

核心:降低类之间的耦合度。


四、创建型模式(5种)

创建型模式提供创建对象的机制,提升已有代码的灵活性和复用性。

4.1 单例模式 ⭐⭐⭐⭐⭐

定义:保证一个类在运行期间只有一个实例对外提供服务。

实现方式对比

实现方式线程安全懒加载性能推荐度
饿汉式⭐⭐⭐
懒汉式(线程不安全)
懒汉式(synchronized)⭐⭐
双重检测⭐⭐⭐⭐
静态内部类⭐⭐⭐⭐
枚举⭐⭐⭐⭐⭐

双重检测实现

publicclassSingleton{// volatile保证可见性和禁止指令重排privatevolatilestaticSingletoninstance=null;privateSingleton(){}publicstaticSingletongetInstance(){// 第一次检查,避免不必要的同步if(instance==null){synchronized(Singleton.class){// 第二次检查,保证线程安全if(instance==null){instance=newSingleton();}}}returninstance;}}

枚举实现(推荐)

publicenumSingleton{INSTANCE;publicvoiddoSomething(){// 业务逻辑}}// 使用Singleton.INSTANCE.doSomething();

4.2 工厂方法模式 ⭐⭐⭐⭐

定义:定义一个创建对象的接口,让子类决定实例化哪个产品类对象。

角色

  • 抽象工厂(Abstract Factory)
  • 具体工厂(Concrete Factory)
  • 抽象产品(Abstract Product)
  • 具体产品(Concrete Product)

示例

// 抽象产品publicinterfaceIFreeGoods{ResponseResultsendFreeGoods(AwardInfoawardInfo);}// 具体产品publicclassDiscountFreeGoodsimplementsIFreeGoods{@OverridepublicResponseResultsendFreeGoods(AwardInfoawardInfo){System.out.println("发放打折券");returnnewResponseResult("200","成功");}}// 抽象工厂publicinterfaceFreeGoodsFactory{IFreeGoodsgetInstance();}// 具体工厂publicclassDiscountFreeGoodsFactoryimplementsFreeGoodsFactory{@OverridepublicIFreeGoodsgetInstance(){returnnewDiscountFreeGoods();}}

4.3 抽象工厂模式

定义:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。

与工厂方法的区别

  • 工厂方法:创建单一产品
  • 抽象工厂:创建产品族(一系列相关产品)

适用场景

  • 需要创建的产品系列有较多共性特征
  • 需要解决跨平台兼容性问题

4.4 建造者模式 ⭐⭐⭐⭐

定义:将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。

适用场景

  • 类的构造函数参数过多(超过4个)
  • 需要创建不可变对象

链式调用实现

publicclassRabbitMQClient{privateStringhost;privateintport;privateStringqueue;privateRabbitMQClient(Builderbuilder){this.host=builder.host;this.port=builder.port;this.queue=builder.queue;}publicstaticclassBuilder{privateStringhost="127.0.0.1";privateintport=5672;privateStringqueue;publicBuildersetHost(Stringhost){this.host=host;returnthis;}publicBuildersetPort(intport){this.port=port;returnthis;}publicBuildersetQueue(Stringqueue){this.queue=queue;returnthis;}publicRabbitMQClientbuild(){// 参数校验if(queue==null){thrownewRuntimeException("队列名称不能为空");}returnnewRabbitMQClient(this);}}}// 使用RabbitMQClientclient=newRabbitMQClient.Builder().setHost("192.168.1.1").setPort(5672).setQueue("order_queue").build();

4.5 原型模式

定义:用已创建的实例作为原型,通过复制该原型对象来创建一个和原型相同的新对象。

适用场景

  • 对象创建成本大(复杂计算、IO操作)
  • 需要保存对象状态(撤销操作)

深克隆 vs 浅克隆

类型基本数据类型引用类型实现方式
浅克隆复制值复制引用clone()
深克隆复制值复制对象序列化/递归clone

深克隆实现

publicclassConcretePrototypeimplementsCloneable,Serializable{privatePersonperson;// 浅克隆@OverrideprotectedConcretePrototypeclone()throwsCloneNotSupportedException{return(ConcretePrototype)super.clone();}// 深克隆(推荐)publicConcretePrototypedeepClone()throwsException{ByteArrayOutputStreambos=newByteArrayOutputStream();ObjectOutputStreamoos=newObjectOutputStream(bos);oos.writeObject(this);ByteArrayInputStreambis=newByteArrayInputStream(bos.toByteArray());ObjectInputStreamois=newObjectInputStream(bis);return(ConcretePrototype)ois.readObject();}}

五、结构型模式(7种)

结构型模式总结类和对象组合在一起的经典结构。

5.1 代理模式 ⭐⭐⭐⭐⭐

定义:为其他对象提供一种代理以控制对这个对象的访问。

三种实现方式

实现方式特点适用场景
静态代理编译时确定,需手动编写代理类简单场景
JDK动态代理基于接口,运行时生成有接口的场景
CGLIB动态代理基于继承,可代理普通类无接口的场景

JDK动态代理示例

publicclassProxyFactory{privateObjecttarget;publicProxyFactory(Objecttarget){this.target=target;}publicObjectgetProxyInstance(){returnProxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),(proxy,method,args)->{System.out.println("前置增强");Objectresult=method.invoke(target,args);System.out.println("后置增强");returnresult;});}}

应用场景

  • 远程代理:RPC调用
  • 虚拟代理:延迟加载
  • 保护代理:权限控制
  • 智能引用:引用计数

5.2 桥接模式

定义:将抽象部分与它的实现部分分离,使它们都可以独立地变化。

核心思想:用组合替代继承,避免类爆炸。

示例:支付系统(支付渠道 × 支付方式)

支付渠道(微信、支付宝) ↓ 组合 支付方式(密码、人脸、指纹)

5.3 装饰者模式

定义:动态地给一个对象添加一些额外的职责。

特点

  • 比继承更灵活
  • 可以动态添加/移除功能
  • 符合开闭原则

经典应用:Java IO流

// 层层包装,动态添加功能InputStreamis=newFileInputStream("test.txt");BufferedInputStreambis=newBufferedInputStream(is);DataInputStreamdis=newDataInputStream(bis);

5.4 适配器模式

定义:将一个类的接口转换成客户希望的另外一个接口。

两种实现

  • 类适配器:通过继承实现
  • 对象适配器:通过组合实现(推荐)

应用场景

  • 接口不兼容
  • 复用旧代码
  • 统一多个类的接口

5.5 门面模式(外观模式)

定义:为子系统中的一组接口提供一个一致的界面。

作用

  • 简化客户端调用
  • 降低耦合度
  • 分层架构的入口

5.6 组合模式

定义:将对象组合成树形结构以表示"部分-整体"的层次结构。

适用场景

  • 树形结构场景
  • 统一处理叶子节点和容器

经典应用:文件系统、组织架构

5.7 享元模式

定义:运用共享技术有效地支持大量细粒度的对象。

核心思想:复用对象,减少内存占用。

经典应用

  • Java字符串常量池
  • 数据库连接池
  • 线程池

六、行为型模式(11种)

行为型模式负责对象间的高效沟通和职责传递委派。

模式定义应用场景
观察者模式定义对象间的一对多依赖关系事件监听、消息订阅
模板方法模式定义算法骨架,子类实现步骤框架设计、流程控制
策略模式定义算法族,分别封装起来支付方式、排序算法
职责链模式将请求的发送者和接收者解耦审批流程、过滤器链
迭代器模式提供一种方法顺序访问聚合对象集合遍历
状态模式允许对象在内部状态改变时改变行为订单状态、游戏状态
命令模式将请求封装为对象撤销/重做、队列请求
备忘录模式在不破坏封装性的前提下捕获对象状态撤销操作、游戏存档
访问者模式将数据结构与操作分离编译器、报表生成
中介者模式定义一个中介对象来封装一系列对象交互聊天室、MVC控制器
解释器模式为语言创建解释器正则表达式、SQL解析

6.1 观察者模式 ⭐⭐⭐⭐⭐

定义:定义对象间的一对多依赖关系,当一个对象状态改变时,所有依赖于它的对象都得到通知并被自动更新。

经典应用

  • Java的ObservableObserver
  • Spring事件监听机制
  • 消息队列(MQ)

6.2 模板方法模式 ⭐⭐⭐⭐

定义:定义一个操作中的算法骨架,而将一些步骤延迟到子类中。

经典应用

  • Spring的JdbcTemplate
  • Servlet的doGet/doPost

6.3 策略模式 ⭐⭐⭐⭐⭐

定义:定义算法族,分别封装起来,让它们可以互相替换。

经典应用

  • Java的Comparator接口
  • Spring的Resource加载策略

七、设计模式速查表

7.1 设计原则速查

原则口诀关键词
SRP一类一职责粒度、内聚
OCP对扩展开放抽象、接口
LSP子类可替换继承、多态
ISP接口要分离最小化、专注
DIP依赖抽象接口编程
LoD最少知道解耦、中介

7.2 设计模式速查

类型模式核心思想记忆口诀
创建型单例全局唯一一夫一妻
创建型工厂方法子类决定实例各司其职
创建型抽象工厂创建产品族家族企业
创建型建造者分步骤构建步步为营
创建型原型复制创建克隆自己
结构型代理控制访问找代理人
结构型装饰者动态增强锦上添花
结构型适配器接口转换转换插头
结构型桥接组合代替继承桥接两岸
结构型门面统一入口门面担当
结构型组合树形结构整体部分
结构型享元共享复用共享资源
行为型观察者订阅通知一呼百应
行为型策略算法替换随机应变
行为型模板方法骨架实现按部就班
行为型职责链链式处理层层上报

7.3 面试高频题

  1. 单例模式的线程安全实现?(双重检测、静态内部类、枚举)
  2. 工厂模式建造者模式的区别?
  3. JDK动态代理CGLIB动态代理的区别?
  4. Spring中使用了哪些设计模式?
  5. 浅克隆深克隆的区别及实现?

总结

本文系统讲解了23种GoF设计模式:

  1. 六大设计原则(SOLID):单一职责、开闭、里氏替换、接口隔离、依赖倒置、迪米特法则
  2. 创建型模式(5种):单例、工厂方法、抽象工厂、建造者、原型
  3. 结构型模式(7种):代理、桥接、装饰者、适配器、门面、组合、享元
  4. 行为型模式(11种):观察者、模板方法、策略、职责链、迭代器、状态、命令、备忘录、访问者、中介者、解释器

学习建议

  • 先理解设计原则,再学习设计模式
  • 结合实际项目,在实践中应用
  • 阅读优秀框架源码(Spring、JDK)
  • 不要过度设计,简单问题简单解决

设计模式是内功,不是招式。掌握设计思想比记忆具体实现更重要。


关键词:设计模式, GoF, 单例模式, 工厂模式, 代理模式, 观察者模式, 策略模式, 建造者模式, SOLID原则, UML类图

如果本文对你有帮助,欢迎点赞、收藏、关注!有任何设计模式相关问题,欢迎在评论区留言讨论。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 9:41:12

164.iPhone刷机报错-1根治|签名过期、USB异常、固件不兼容解决方案

摘要 本文系统阐述基于Android与iOS双平台的手机刷机与维修全流程,涵盖高通、联发科、苹果A系列芯片底层原理,提供可落地的Fastboot、Download Mode、DFU模式操作方案。通过完整的Python脚本实现设备状态检测与刷机包校验,解决变砖、Bootloop、基带丢失等常见故障。所有步骤…

作者头像 李华
网站建设 2026/6/10 9:32:52

2026年度实战检验:10款主流「AI面试」工具深度测评与选型指南

在我们过往的数字工具盘点中,探讨了大量底层AI大模型的逻辑推理能力。但当求职者真正踏入考场,面对面试官连珠炮般的追问、突发的情境假设以及专业英语术语的夹击时,仅仅是“懂得多”已经不够用了。对于高压下的面试模拟而言,响应…

作者头像 李华
网站建设 2026/6/10 9:30:05

10kV配网故障识别:波形分析全攻略

引言:10kV配电网是城市供电的"最后一公里",也是故障最频发的环节。据统计,配网故障中约70%为单相接地故障,短路故障约占20%,其余为断线、谐振等异常工况。传统故障指示器仅能"报警",而…

作者头像 李华