主流的设计模式共有 23 种,建议大家按照以下四个阶段来学习:
- 基础学习
- 编码实现
- 项目实战
- 备战面试
其中第一个阶段和第二个阶段 可以同时进行 ,即对于每个设计模式的学习都是:先了解、再编码实现。
#一、基础学习
本阶段的目标:依次了解每一种设计模式的应用场景、特点、UML 类图,能够对设计模式有个基础的印象。
#学习顺序
根据使用频率、难易度、面试考察率等综合排序,仅供参考,并不绝对!
优先:
- 单例模式
- 工厂方法模式
- 迭代器模式
- 策略模式
- 建造者模式
- 模板方法模式
- 代理模式
- 责任链模式
- 抽象工厂模式
- 适配器模式
- 观察者模式
- 外观模式
一般:
- 桥接模式
- 组合模式
- 装饰器模式
- 状态模式
- 访问者模式
- 中介者模式
- 命令模式
- 备忘录模式
低优先:
- 原型模式
- 享元模式
- 解释器模式
#推荐资源
- 书籍
- 《图解设计模式》:https://www.aliyundrive.com/s/jcQugLGNs1V (opens new window)提取码: 5i9c(强烈推荐,用 Java 语言实现,图多、有示例代码、有习题和答案,很不错)
- 《大话设计模式》:https://www.aliyundrive.com/s/73jZWnfAtaA (opens new window)提取码: 9gc7(比较有趣)
- 《Head First 设计模式》:https://www.aliyundrive.com/s/GnuQcruh7Us (opens new window)提取码: 9gc7
- 《设计模式:可复用面向对象软件的基础》:https://www.aliyundrive.com/s/T9ECaPtxzg4 (opens new window)提取码: 9gc7(大黑书,难度较大,有能力和时间才去读)
- 《JavaScript 设计模式与开发实践》:https://www.aliyundrive.com/s/tzcZCU8bqnR (opens new window)提取码: 9gc7(适合前端同学阅读)
- 《Python 设计模式》:https://www.aliyundrive.com/s/3RNoX31XqUy (opens new window)提取码: 9gc7
- 视频
- 尚硅谷图解 Java 设计模式:https://www.bilibili.com/video/BV1G4411c7N4 (opens new window)(讲的很棒也很全面,也和一些主流框架相结合,系统学习 Java 的同学可以看)
- 五分钟学设计模式:https://www.bilibili.com/video/BV1af4y1y7sS (opens new window)(小短快科普,比较轻松)
- 黑马程序员Java设计模式详解:https://www.bilibili.com/video/BV1Np4y1z7BU (opens new window)(很完整,最后讲解了 Spring 框架的部分设计)
- 用一个项目讲解 23 种设计模式:https://www.bilibili.com/video/BV19g411N7yx (opens new window)(和项目结合,思路不错,但其中有一些直播翻车,可部分跳过)
- 文档
- 菜鸟教程:https://www.runoob.com/design-pattern/design-pattern-tutorial.html (opens new window)(还是比较推荐的,学过设计模式后如果忘记了,可以查看这个文档快速补回来)
- C++ 图说设计模式:https://design-patterns.readthedocs.io/zh_CN/latest/(opens new window)
- Go 语言设计模式系列博客:https://lailin.xyz/post/singleton.html(opens new window)
#二、编码实现
本阶段的目标:依次编码实现每个设计模式,用任何支持面向对象的编程语言都可以,最好能够独立(不借助任何资料)从 0 写出每个设计模式的代码。
#资源
一些源码示例,仅供参考,更多的内容可以直接在 GitHub 搜索关键词 Design Pattern
或 设计模式
:
- 各语言设计模式示例代码:https://github.com/wx-chevalier/design-pattern-examples(opens new window)
- Java 23 种设计模式全归纳:https://github.com/youlookwhat/DesignPattern (opens new window)(教程 + 源码)
- C++ 设计模式源码:https://github.com/liu-jianhao/Cpp-Design-Patterns (opens new window)(设计模式介绍 + 源码)
- JavaScript 示例代码:
- https://github.com/wchaowu/javascript(opens new window)
- https://github.com/zy445566/design-pattern-in-javascript(opens new window)
- Python 示例代码:
- https://github.com/wklken/py-patterns(opens new window)
- Go 示例代码
- https://github.com/mohuishou/go-design-pattern(opens new window)
#三、项目实战
本阶段的目标:通过做项目或阅读项目源码来进一步强化每个设计模式的实际应用。做到能根据某个场景主动选出合适的设计模式来优化代码、灵活运用,并且能够通过文件命名、项目目录结构等途径来快速判断出某个框架是否使用了设计模式。
可以先通过一个视频了解设计模式的实际应用:
- 实际工作中,如何运用 Java 设计模式:https://www.bilibili.com/video/BV1tK4y1s7Uo(opens new window)
列举一些设计模式在框架源码中的应用:
部分内容源于网络
- Spring
- 工厂模式:通过 BeanFactory 和 ApplicationContext 来创建对象
- 单例模式:Spring Bean 默认为单例模式
- 策略模式:例如 Resource 的实现类,针对不同的资源文件,实现了不同方式的资源获取策略
- 代理模式:Spring 的 AOP 功能用到了 JDK 的动态代理和 CGLIB 字节码生成技术
- 模板方法:可以将相同部分的代码放在父类中,而将不同的代码放入不同的子类中,用来解决代码重复的问题。比如RestTemplate、JmsTemplate、JpaTemplate
- 适配器模式:Spring AOP 的增强或通知(Advice)使用到了适配器模式
- 观察者模式:Spring 事件驱动模型
- 桥接模式:可以根据客户的需求能够动态切换不同的数据源。比如我们的项目需要连接多个数据库,客户在每次访问中根据需要会去访问不同的数据库
- Spring MVC
- 组合模式:WebMvcConfigurerComposite,树枝和树叶都实现了相同的抽象类或接口 WebMvcConfigurer
- 责任链模式:DispatcherServlet 依次拦截和处理请求
- 适配器模式:HandlerAdapter 处理器适配
- MyBatis(参考:https://blog.csdn.net/aha_jasper/article/details/108701785 (opens new window))
- Builder + Factory 模式:创建 SqlSession 工厂和 SqlSession
- 模板方法模式:BaseExecutor 定义执行器基本流程
- 解释器模式:SqlNode 动态解析 SQL
- 单例模式:ErrorContext 线程唯一
- 装饰器模式:Cache 的实现用组合而非继承实现更灵活地缓存方式结合
- 迭代器模式:PropertyTokenizer 利用迭代器模式实现属性解析器
- 适配器模式:Log 适配不同的日志框架
- Google Guava(参考:https://blog.csdn.net/aha_jasper/article/details/108695561 (opens new window))
- Builder 模式:更方便地构建内存缓存
- Wrapper 模式(代理模式、装饰器、适配器模式):轻松实现对类的扩展
- Immutable 模式:不可变集合实现,如 ImmutableList、ImmutableSet、ImmutableMap 等
- 更多可以自行学习:
- Netty
- SpringBoot
- Tomcat
- Dubbo
- Spring Cloud
#资源
- 《设计模式之美》专栏:https://blog.csdn.net/aha_jasper/article/details/105695163 (opens new window)(原作者 Google 王争设计模式之美:https://time.geekbang.org/column/intro/250 (opens new window),是极客时间的付费课,里面的内容,尤其是开源实战和项目实战的部分讲的很好!有收获的朋友还是请支持正版哦)
- Spring 相关框架源码分析视频:https://www.bilibili.com/video/BV1kF411e7WR (opens new window)(结合设计模式,包括 Spring、SpringMVC、SpringBoot、Tomcat 等)
#四、备战面试
面试时对设计模式的考察主要有 4 种形式:
- 直接问你某个设计模式的作用和大致的原理,考察你对设计模式的了解程度
- 让你手写某个设计模式的代码,考察你对设计模式的熟悉程度和编码能力
- 给你一个实际的业务场景,让你去设计系统,考察你对设计模式的理解应用能力和逻辑思维
- 问你某个框架(轮子)的核心设计和源码细节,考察你对设计模式的理解应用能力
#经典面试题
- 理论:简单介绍一下软件开发原则?
- 理论:设计模式如何分类?
- 你用过哪些设计模式?举例说明设计模式在你的项目或是某个框架源码中的应用。
- 说出某个设计模式的优缺点?什么时候使用它?
- 单例模式有哪些实现方式?分别有哪些优缺点?请手写其中一种
- 原型模式和单例模式的区别是什么?
- 简单工厂、工厂方法和抽象工厂三者有什么区别?
- 介绍一下代理模式,说一下静态代理和动态代理(比如 Spring AOP 就用到了)的区别?
#资源
- 设计模式面试题汇总:https://pan.baidu.com/s/1tjIGc7pnHjgiFPo0fhcKXw (opens new window)提取码: wuan(朋友 JavaGuide 整理,很全面 )
- 面试官最爱问的13道"设计模式"题(视频):面试官最爱问的13道"设计模式"题,答不上的继续学习深入解读23种设计模式[附笔记+源代码]!【马士兵】_哔哩哔哩_bilibili