编程导航教程

首页

设计模式学习路线 | 26 年最新零基础到精通一条龙(万人收藏⭐️)

2024-05-11 15:07
阅读 1.3w
下载文档
评论
问答
笔记
0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
大纲
    1

    编程导航学习网站:学编程、做项目、拿 Offer!

    企业高频面试题库:开始刷题,面试遇原题!

    精选简历模板大全:1 分钟搞定简历!

    AI 资源导航网站:获取最新 AI 黑科技!

    1 对 1 模拟面试:随时随地提升面试能力

    设计模式求职高频面试题:开始刷题

    ⭐️ 推荐先观看 鱼皮的设计模式导学视频,快速掌握设计模式的高效学习法

    开篇介绍

    大家有没有思考过这样几个问题?

    • 同样都是写代码,为什么有些同学的思路清晰、代码整洁;而我的代码却充满了重复和混乱,每次要修改时都无从下手、Bug 一堆?
    • 如何写代码,才能使得项目易于扩展和维护?
    • 我每天都在写重复的代码,如何提升水平?
    • 为什么我读不懂大佬写的源码?是不是缺少了什么知识?

    如果存在上述问题,那么我们一定要学习软件开发中的重要技能 —— 设计模式。

    设计模式是什么?

    设计模式是软件开发人员在软件开发过程中面临的一般问题的 通用解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

    通俗地说,就是前辈们在写代码时摸索出了一些不错的方法,可以用于解决一类问题、更好地开发和维护项目。于是其他软件开发者纷纷效仿,久而久之,就得出了一套优秀的软件开发方法总结。

    目前最为经典的设计模式有 23 种,学习之后,不仅能帮助我们开拓思路、写出更优质的代码、提高项目的开发和维护效率;还能够帮助我们更好地阅读和理解源码,甚至可以根据文件名称直接推断出源码的架构设计(有点行话的感觉)!

    此外,设计模式也是软件开发相关岗位面试的重点(尤其是大厂、后端开发岗位),建议大家有时间的话都要学习。在 AI 时代,虽然 AI 能帮我们生成代码,但好的设计模式能让代码更易维护、更易扩展,这是 AI 无法完全替代的。

    学习前提

    1. 至少学过一门编程语言(学设计模式时需要多写代码实践)
    2. 使用过至少一门开发框架(这样在学习设计模式的时候能够和框架的设计结合起来,更好理解)

    前端要不要学设计模式?

    先学习基础的界面开发、组件库和框架的使用,之后可以将设计模式作为进阶知识来学习,想进大厂建议学习。毕竟设计模式是软件开发的通用思想 / 技能,独立于编程语言。

    学习路线图

    设计模式学习路线思维导图

    整体学习建议

    1)先理解再实现:对设计模式的学习,要先了解每种设计模式是什么、作用是什么、能够解决什么问题、适用于什么场景、有什么特点,再去考虑编码实现。建议结合 UML 类图来理解类和对象的关系。

    2)一定要多写代码实践:最好每个设计模式都实现一遍,不要去背代码,用的多了自然就能写出代码了。可以用你熟悉的任何支持面向对象的编程语言来实现(Java、C++、Python、Go 等都可以)。

    3)每个设计模式都可以独立学习:23 种设计模式互相之间联系不大,因此可以根据自己的时间来选择性学习(比如先学重点的单例模式、工厂模式等),不用按顺序全部学完。

    4)结合框架源码学习:学会基础的设计模式后,可以分析之前学过的框架源码(比如 Spring、MyBatis 等),参考别人是如何应用设计模式的。关于 Spring Boot 的详细学习,可以查看 Spring Boot 学习路线;关于 MyBatis 的详细学习,可以查看 MyBatis 框架学习路线。这样能加深理解,也能提升阅读源码的能力。

    5)善用 AI 辅助学习:遇到不理解的设计模式,可以问 AI 工具(如 ChatGPT、DeepSeek)让它用通俗的语言解释,或者让它举个生活中的例子。AI 还可以帮你生成设计模式的示例代码,方便你理解和学习。更多 AI 工具推荐可以看 AI 导航。

    AI资源大全网站

    6)不要过度依赖设计模式:设计模式并不是银弹,过分使用设计模式可能只会增加系统的复杂度。实际开发中,要根据具体场景来选择是否使用设计模式,适合的才是最好的。

    设计模式知识体系

    • 软件开发原则
      • 单一职责原则(SRP)
      • 开闭原则(OCP)
      • 里氏替换原则(LSP)
      • 依赖倒置原则(DIP)
      • 接口隔离原则(ISP)
      • 迪米特法则(最少知道原则)
      • 合成 / 聚合复用原则(CARP)
    • 设计模式分类
      • 根据作用范围:类 / 对象模式
      • 根据目的分类:创建型 / 结构型 / 行为型模式
    • 创建型模式:如何创建对象
      • 单例模式(懒汉式、饿汉式、双检锁、线程唯一单例)
      • 工厂方法模式(类)
      • 抽象工厂模式
      • 建造者模式
      • 原型模式
    • 结构型模式:如何将类或对象结合在一起形成一个更强大的结构
      • 适配器模式(类 / 对象)
      • 组合模式
      • 装饰器模式
      • 代理模式
      • 享元模式
      • 外观模式
      • 桥接模式
    • 行为型模式:类或对象间如何交互、如何划分职责,从而更好地完成任务
      • 迭代器模式
      • 模板方法模式(类)
      • 策略模式
      • 命令模式
      • 状态模式
      • 责任链模式
      • 备忘录模式
      • 观察者模式
      • 访问者模式
      • 中介者模式
      • 解释器模式(类)

    知识表

    设计模式适用层次引入时机复杂度变化实现体现的原则
    工厂方法代码级编码时简单子类的实例化对象的创建工作延迟到子类开闭原则
    单例代码级、应用级设计时、编码时简单唯一实例封装对象产生的个数
    门面应用级、构架级设计时、编码时简单子系统的高层接口封装子系统开闭原则
    模板方法代码级编码时、重构时简单算法子步骤的变化封装算法结构依赖倒置原则
    抽象工厂应用级设计时较复杂产品家族的扩展封装产品族系列内容的创建开闭原则
    组合代码级编码时、重构时较复杂复杂对象接口的统一统一复杂对象的接口里氏代换原则
    代理应用级、构架级设计时、编码时简单对象访问的变化封装对象的访问过程里氏代换原则
    命令应用级设计时、编码时较简单请求的变化封装行为对对象开闭原则
    观察者应用级、构架级设计时、编码时较简单通讯对象的变化封装对象通知开闭原则
    策略应用级设计时一般算法的变化封装算法里氏代换原则
    建造者代码级编码时一般对象组建的变化封装对象的组建过程开闭原则
    Adapter代码级重构时一般对象接口的变化接口的转换
    桥接代码级设计时、编码时一般对象的多维度变化分离接口以及实现开闭原则
    装饰器代码级重构时较复杂对象的组合职责在稳定接口上扩展开闭原则
    迭代器代码级、应用级编码时、重构时较简单对象内部集合的变化封装对象内部集合的使用单一职责原则
    中介者应用级、构架级编码时、重构时一般对象交互的变化封装对象间的交互开闭原则
    备忘录代码级编码时较简单状态的辅助保存封装对象状态的变化接口隔离原则
    状态应用级设计时、编码时一般对象状态的变化封装与状态相关的行为单一职责原则
    访问者应用级设计时较复杂对象操作变化封装对象操作变化开闭原则
    原型应用级编码时、重构时较简单实例化的类封装对原型的拷贝依赖倒置原则
    享元代码级、应用级设计时一般系统开销的优化封装对象的获取
    责任链应用级、构架级设计时、编码时较复杂对象的请求过程封装对象的责任范围
    解释器应用级设计时较复杂领域问题的变化封装特定领域的变化

    主流的设计模式共有 23 种,建议大家按照以下四个阶段来学习:

    1. 基础学习
    2. 编码实现
    3. 项目实战
    4. 求职备战

    其中第一个阶段和第二个阶段 可以同时进行,即对于每个设计模式的学习都是:先了解、再编码实现。

    阶段 1:基础学习(10-20 天,仅供参考)

    学习目标:依次了解每一种设计模式的应用场景、特点、UML 类图,能够对设计模式有个基础的印象。

    学习顺序

    根据使用频率、难易度、面试考察率等综合排序,仅供参考。

    优先学习(高频重点):

    1. 单例模式【必学】
    2. 工厂方法模式【必学】
    3. 代理模式【必学,面试重点】
    4. 策略模式【必学】
    5. 观察者模式【必学】
    6. 建造者模式【建议学】
    7. 模板方法模式【建议学】
    8. 责任链模式【建议学】
    9. 抽象工厂模式【建议学】
    10. 适配器模式【建议学】
    11. 外观模式【建议学】
    12. 迭代器模式【建议学】

    一般(按需学习):

    1. 桥接模式
    2. 组合模式
    3. 装饰器模式
    4. 状态模式
    5. 访问者模式
    6. 中介者模式
    7. 命令模式
    8. 备忘录模式

    低优先(了解即可):

    1. 原型模式
    2. 享元模式
    3. 解释器模式

    除了这 23 种主流设计模式外,还有一些其他设计模式,比如 Immutable 不可变模式等,了解即可。

    学习资源

    • ⭐ 鱼皮的设计模式学习项目:GitHub 开源,包含 23 种设计模式的示例代码和讲解
    • ⭐ 尚硅谷图解 Java 设计模式:讲的很棒也很全面,结合主流框架源码分析
    • 黑马程序员 Java 设计模式详解:23 种 Java 设计模式(图解 + 框架源码分析 + 实战)
    • 2025 版 2 小时彻底搞定 23 种设计模式:快速入门版本
    • 《图解设计模式》:图多、有示例代码、有习题和答案,强烈推荐
    • 《Head First 设计模式》:经典书籍,通俗易懂
    • 《大话设计模式》:比较有趣
    • C++ 图说设计模式:C++ 实现版本

    阶段 2:编码实现(和阶段 1 同步进行)

    学习目标:依次编码实现每个设计模式,用任何支持面向对象的编程语言都可以,最好能够独立(不借助任何资料)从 0 写出每个设计模式的代码。

    学习资源

    一些源码示例,仅供参考,更多的内容可以直接在 GitHub 搜索关键词 Design Pattern 或 设计模式:

    • ⭐ 鱼皮的设计模式学习项目:包含 23 种设计模式的 Java 实现
    • 各语言设计模式示例代码:多语言实现
    • Java 23 种设计模式全归纳:教程 + 源码
    • C++ 设计模式源码:设计模式介绍 + 源码
    • JavaScript 设计模式示例:前端实现
    • Python 设计模式示例:Python 实现
    • Go 设计模式示例:Go 实现

    阶段 3:项目实战(10-15 天,仅供参考)

    学习目标:通过做项目或阅读项目源码来进一步强化每个设计模式的实际应用。做到能根据某个场景主动选出合适的设计模式来优化代码、灵活运用,并且能够通过文件命名、项目目录结构等途径来快速判断出某个框架是否使用了设计模式。

    学习建议

    1)结合框架源码学习:学完设计模式后,一定要去看看主流框架(Spring、MyBatis、Netty 等)是如何应用设计模式的。这样能加深理解,也能提升阅读源码的能力。

    2)在自己的项目中尝试应用:不要只看不练,尝试在自己的项目中应用设计模式来优化代码。但要注意,不要为了用设计模式而用设计模式,要根据实际场景来选择。

    3)现在有了 AI,可以利用 AI 分析你的项目,并且给出如何自然巧妙地运用设计模式来优化项目的建议。

    学习资源

    • 实际工作中如何运用 Java 设计模式:实战经验分享
    • 黑马 23 种 Java 设计模式详解(图解+框架源码分析+实战):可按照个人喜好学习
    • 2 小时快速学习 23 种设计模式:适合复习
    • Java 设计模式视频教程(图解+框架源码):虽然比较老,但讲的还不错

    GitHub 实战项目

    Java 实现:

    • ⭐ iluwatar/java-design-patterns:93k+ stars,23种设计模式的Java实现,包含详细文档和示例代码,代码质量极高

    Python 实现:

    • faif/python-patterns:42k+ stars,Python实现的设计模式集合,含创建型、结构型、行为型模式

    Go 实现:

    • tmrts/go-patterns:27k+ stars,Go语言设计模式、并发模式和同步模式实现

    其他资源:

    • DovAmir/awesome-design-patterns:45k+ stars,软件和架构设计模式资源大全
    • DesignPatternsPHP/DesignPatternsPHP:22k+ stars,PHP 8.x中的设计模式示例代码
    • ochococo/Design-Patterns-In-Swift:15k+ stars,Swift 5.0实现的设计模式

    框架源码中的设计模式应用

    下面列举一些设计模式在主流框架源码中的应用:

    1)Spring

    • 工厂模式:通过 BeanFactory 和 ApplicationContext 来创建对象
    • 单例模式:Spring Bean 默认为单例模式
    • 策略模式:例如 Resource 的实现类,针对不同的资源文件,实现了不同方式的资源获取策略
    • 代理模式:Spring 的 AOP 功能用到了 JDK 的动态代理和 CGLIB 字节码生成技术
    • 模板方法:可以将相同部分的代码放在父类中,而将不同的代码放入不同的子类中,用来解决代码重复的问题。比如RestTemplate、JmsTemplate、JpaTemplate
    • 适配器模式:Spring AOP 的增强或通知(Advice)使用到了适配器模式
    • 观察者模式:Spring 事件驱动模型
    • 桥接模式:可以根据客户的需求能够动态切换不同的数据源。比如我们的项目需要连接多个数据库,客户在每次访问中根据需要会去访问不同的数据库

    2)Spring MVC

    • 组合模式:WebMvcConfigurerComposite,树枝和树叶都实现了相同的抽象类或接口 WebMvcConfigurer
    • 责任链模式:DispatcherServlet 依次拦截和处理请求
    • 适配器模式:HandlerAdapter 处理器适配

    3)MyBatis

    • Builder + Factory 模式:创建 SqlSession 工厂和 SqlSession
    • 模板方法模式:BaseExecutor 定义执行器基本流程
    • 解释器模式:SqlNode 动态解析 SQL
    • 单例模式:ErrorContext 线程唯一
    • 装饰器模式:Cache 的实现用组合而非继承实现更灵活地缓存方式结合
    • 迭代器模式:PropertyTokenizer 利用迭代器模式实现属性解析器
    • 适配器模式:Log 适配不同的日志框架

    4)Google Guava

    • Builder 模式:更方便地构建内存缓存
    • Wrapper 模式(代理模式、装饰器、适配器模式):轻松实现对类的扩展
    • Immutable 模式:不可变集合实现,如 ImmutableList、ImmutableSet、ImmutableMap 等

    更多框架可以自行学习: Netty、SpringBoot、Tomcat、Dubbo、Spring Cloud

    阶段 4:求职备战(面试前 1 个月突击)

    设计模式是软件开发相关岗位面试的高频考点,尤其是大厂和后端开发岗位。

    学习目标:熟练掌握常见设计模式的面试题,能够流畅回答面试官的提问,能够手写常用设计模式的代码,顺利通过设计模式相关的面试环节。

    学习建议

    1)理解比死记硬背重要:设计模式的面试题主要考察你对设计模式的理解和应用能力,而不是背概念。建议先理解每个设计模式的核心思想和应用场景,再去看面试题。

    2)准备简历上的项目经历:如果简历上的项目用到了设计模式,一定要提前准备好如何讲解。面试官很可能会问你为什么选择这个设计模式、如何实现的、有什么好处等。

    3)准备手写代码:单例模式、工厂模式、代理模式等高频设计模式,要能够熟练手写代码。建议提前练习几遍,面试时才不会紧张。

    4)多看真实面经:真实面经大全,了解不同公司对设计模式的考察重点。

    5)看面试题讲解视频:推荐关注 面试鸭 B 站账号,里面有设计模式相关的面试题讲解。

    更多求职干货:编程导航求职干货分享

    面试考察形式

    面试时对设计模式的考察主要有 4 种形式:

    1. 直接问你某个设计模式的作用和大致的原理,考察你对设计模式的了解程度
    2. 让你手写某个设计模式的代码,考察你对设计模式的熟悉程度和编码能力
    3. 给你一个实际的业务场景,让你去设计系统,考察你对设计模式的理解应用能力和逻辑思维
    4. 问你某个框架(轮子)的核心设计和源码细节,考察你对设计模式的理解应用能力

    经典面试题

    1. 简单介绍一下软件开发原则?
    2. 设计模式如何分类?
    3. 你用过哪些设计模式?举例说明设计模式在你的项目或是某个框架源码中的应用。
    4. 说出某个设计模式的优缺点?什么时候使用它?
    5. 单例模式有哪些实现方式?分别有哪些优缺点?请手写其中一种【高频】
    6. 原型模式和单例模式的区别是什么?
    7. 简单工厂、工厂方法和抽象工厂三者有什么区别?
    8. 介绍一下代理模式,说一下静态代理和动态代理(比如 Spring AOP)的区别?【高频】

    面试题库

    • ⭐ 设计模式面试题 - 面试鸭

    面试鸭刷题神器热门八股文

    面试题讲解视频

    • 面试官最爱问的 13 道"设计模式"题:面试题详细讲解

    加油小伙伴们 💪🏻!

    程序员必备资源

    1)程序员学习交流圈:极客教程、实战项目、求职宝典

    2)程序员面试八股文:实习/校招/社招高频考点、企业真题解析

    3)程序员写简历神器:专业模板、丰富例句、直通面试

    4)AI 知识资源大全:前沿技术、最新 AI 资讯、提示词大全

    5)1 对 1 模拟面试:实习/校招/社招面试拿 Offer 必备