本文所有内容均节选自《设计模式就该这样学》

本文自2012年10月29日起持续连载,请大家持续关注....

序言

Design Patterns: Elements of Reusable Object-Oriented Software(以下简称《设计模式》),一书由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides合著(Addison-Wesley,1995)。这四位作者常被称为“四人组(Gang of Four)”,而这本书也就被称为“四人组(或 GoF)”书。他们首次给我们总结出一套软件开发可以反复使用的经验,帮助我们提高代码的可重用性、系统的可维护性等,解决软件开发中的复杂问题。

设计模式已诞生20多年,其间相继出版的关于设计模式的经典著作不计其数。如果说GoF的《设计模式》是设计模式领域的“圣经”,那么之后出版的各种关于设计模式的书籍可称为“圣经”的“批注版”或者“白话版”。本书正是基于GoF的《设计模式》来编写的。

《设计模式》总结的是经验之谈,千万不要死记硬背,生搬硬套。下面来总体预览一下设计模式的分类和总结,如下表所示。

分 类 解 释 举 例
创建型设计模式(Creational) 这类设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用新的运算符直接实例化对象,这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活 工厂方法模式(Factory Method Pattern)、抽象工厂模式(Abstract Factory Pattern)、单例模式(Singleton Pattern)、原型模式(Prototype Pattern)、建造者模式(Builder Pattern)
结构型设计模式(Structural) 这类设计模式关注类和对象的组合。继承的概念被用来组合接口和定义组合对象获得新功能的方式 代理模式(Proxy Pattern)、门面模式(Facade Pattern)、装饰器模式(Decorator Pattern)、享元模式(Flyweight Pattern)、组合模式(Composite Pattern)、适配器模式(Adapter Pattern)、桥接模式(Bridge Pattern)
行为型设计模式(Behavioral) 这类设计模式特别关注对象之间的通信 模板方法模式(Template Method Pattern)、策略模式(Strategy Pattern)、责任链模式(Chain of Responsibility Pattern)、迭代器模式(Iterator Pattern)、命令模式(Command Pattern)、状态模式(State Pattern)、备忘录模式(Memento Pattern)、中介者模式(Mediator Pattern)、解释器模式(Interpreter Pattern)、观察者模式(Observer Pattern)、访问者模式(Visitor Pattern)

本文是我对“圣经”实践的精华总结,全文内容节选自《设计模式就该这样学》,这是一本可以真正能够落地的“设计模式”之书,也是目前唯一一本结合框架源码如何落地“设计模式”这个角度来理解设计模式的书。本文也将会结合JDK、Spring、MyBatis、Tomcat、Netty等经典框架源码展开对设计模式的分析。当然,本文还会结合我多年的“踩坑填坑”经验和“教学答疑”经验,用比“圣经”更深刻、更全面、更通俗、更生动、更有趣、更接地气的方式并且结合真实业务场景分析每种设计模式的优缺点,治愈“设计模式选择困难症”。选设计模式就像相亲选对象,一旦做好了接受TA缺点的准备,那TA就一定属于你。所以,本文对于日常开发而言更具有指导意义。

Tom弹架构,只弹干货不掺水,本文所有分享内容均从实战角度出发,不谈概念,只谈实战和应用落地

1 各种设计模式使用频率总结

以下是根据本人的个人经验,对设计模式使用频率的总结,不可作为学术依据,仅供大家参考。因为设计模式的选择还是要依赖具体的业务场景的,每个人接触的业务领域都不一样,自然设计模式的选择也会不一样。

1.1 创建型设计模式

如下图所示,创建型设计模式中使用频率由高到低依次为工厂方法模式、抽象工厂模式、建造者模式、单例模式、原型模式。原型模式一般都有现成的工具类,自己造轮子的情况比较少。

1.2 结构型设计模式

如下图所示,结构型设计模式中使用频率由高到低依次为适配器模式、装饰器模式、代理模式、门面模式、组合模式、享元模式、桥接模式。其中桥接模式一般都有现成的工具类,自己造轮子的情况比较少。

1.3 行为型设计模式

如下图所示,行为型设计模式中使用频率由高到低依次为策略模式、观察者模式、责任链模式、解释器模式、模板方法模式、迭代器模式、中介者模式、命令模式、访问者模式、备忘录模式、状态模式。其中,观察者模式、解释器模式、迭代器模式、中介者模式、命令模式、访问者模式、备忘录模式一般都有现成的工具类,自己造轮子的情况比较少。

下面根据本人多年研究设计模式的经验总结,将压箱干货首次全网发布。如果本文对您有帮助一定要收藏,也欢迎关注和点赞;如果您有任何建议也可留言评论或私信,您的支持是我坚持创作的动力。关注『 Tom弹架构 』可获取更多技术干货!

2 为什么一定要学习设计模式

标题 备注
Tom弹架构:为什么一定要学习设计模式 2021/10/29已更新

3 七大架构设计原则篇

标题 备注
Tom弹架构:开闭原则(Open-Closed Principle,OCP) 2021/10/21已更新
Tom弹架构:依赖倒置原则(Dependence Inversion Principle,DIP) 2021/10/22已更新
Tom弹架构:单一职责原则(Simple Responsibility Principle,SRP) 2021/10/23已更新
Tom弹架构:接口隔离原则(Interface Segregation Principle,ISP) 2021/10/24已更新
Tom弹架构:迪米特法则(Law of Demeter,LoD) 2021/10/25已更新
Tom弹架构:里氏替换原则(Liskov Substitution Principle,LSP) 2021/10/26已更新
Tom弹架构:合成复用原则(Composite/Aggregate Reuse Principle,CARP) 2021/10/27已更新

目录仅代表更新计划,因精力分配原因不一定按顺序目录顺序连载,计划1个月(即2021年11月31日前)连载完毕,请小伙伴们持续关注本文更新,大家可以先关注和收藏本文或者关注『 Tom弹架构 』更新通知,感谢您的支持!

4 创建型设计模式

标题 备注
Tom弹架构:简单工厂模式(Simple Factory Pattern) >> 彻底说透简单工厂那些你没有关注过的细节 2021/11/10已更新
Tom弹架构:工厂方法模式(Factory Method Pattern)>> 全面通透深入剖析工厂方法模式 2021/11/11已更新
Tom弹架构:抽象工厂模式(Abstract Factory Pattern)>> 手写数据库连接池,让抽象工厂不再抽象 2021/11/12已更新
Tom弹架构:单例模式(Singleton Pattern)>> 这9个单例被破坏的事故现场,你遇到过几个? 2021/10/26已更新
Tom弹架构:原型模式(Prototype Pattern)>> 一文读懂深克隆与浅克隆的关系 2021/11/02已更新
Tom弹架构:建造者模式(Builder Pattern)>> 用建造者模式实现一个防SQL注入的ORM框架 2021/10/26已更新

5 结构型设计模式

标题 备注
Tom弹架构:代理模式(Proxy Pattern)>> 从没有人将代理模式分析得如此透彻 2021/10/27已更新
Tom弹架构:门面模式(Facade Pattern)>> 原来你不知道自己每天都在用门面模式 2021/11/13已更新
Tom弹架构:装饰器模式(Decorator Pattern)>> 趣谈装饰器模式,让你一辈子不会忘 2021/11/01已更新
Tom弹架构:享元模式(Flyweight Pattern)>> 就因为把int改成Integer,第2天被辞了 2021/11/01已更新
Tom弹架构:组合模式(Composite Pattern)>> 没有性能瓶颈的无限级菜单树应该这样设计 2021/11/04已更新
Tom弹架构:适配器模式(Adapter Pattern)>> 如何快速搞定第三方登录且易扩展? 2021/11/03已更新
Tom弹架构:桥接模式(Bridge Pattern)>> 使用桥接模式设计复杂的消息系统 2011/11/08已更新

6 行为型设计模式

标题 备注
Tom弹架构:委派模式(Delegate Pattern)>> 你以为委派模式很神秘,其实你每天都在用 2021/11/09已更新
Tom弹架构:模板方法模式(Template Method Pattern)>> 搞懂钩子方法和模板方法,看完这篇就够了 2021/11/07已更新
Tom弹架构:策略模式(Strategy Pattern)>> 使用策略模式重构电商折扣和支付场景 2021/11/05已更新
Tom弹架构:责任链模式(Chain of Responsibility Pattern)>> 这才是责任链模式的优雅使用方式 2021/10/27已更新
Tom弹架构:迭代器模式(Iterator Pattern) 待更新...
Tom弹架构:命令模式(Command Pattern) 待更新...
Tom弹架构:状态模式(State Pattern) 待更新...
Tom弹架构:备忘录模式(Memento Pattern) 待更新...
Tom弹架构:中介者模式(Mediator Pattern) 待更新...
Tom弹架构:解释器模式(Interpreter Pattern) 待更新...
Tom弹架构:观察者模式(Observer Pattern) 待更新...
Tom弹架构:访问者模式(Visitor Pattern) 待更新...

7 新设计模式

标题 备注
Tom弹架构:对象池模式(Object Pool Pattern) 待更新...
Tom弹架构:规格模式(Specification Pattern) 待更新...
Tom弹架构:空对象模式(Null Object Pattern) 待更新...
Tom弹架构:雇工模式(Employee Pattern) 待更新...

8 一句话归纳设计模式

各种设计模式对比及编程思想总结如下表所示。

设计模式 一句话归纳 目 的 生活案例 框架源码举例
工厂模式(Factory Pattern) 产品标准化,
生产更高效
封装创建细节 实体工厂 LoggerFactory、Calender
单例模式(Singleton Pattern) 世上只有一个我
保证独一无二
CEO BeanFactory、Runtime
原型模式(Prototype Pattern) 拔一根猴毛,
吹出千万个
高效创建对象 克隆 ArrayList、PrototypeBean
建造者模式(Builder Pattern) 高配中配与低配,
想选哪配就哪配
开放个性配置步骤 选配 StringBuilder、
BeanDefinitionBuilder
代理模式(Proxy Pattern) 没有资源没时间,
得找媒婆来帮忙
增强职责 媒婆 ProxyFactoryBean、
JdkDynamicAopProxy、CglibAopProxy
门面模式(Facade Pattern) 打开一扇门,
通向全世界
统一访问入口 前台 JdbcUtils、RequestFacade
装饰器模式(Decorator Pattern) 他大舅他二舅,
都是他舅
灵活扩展、
同宗同源
煎饼 BufferedReader、InputStream
享元模式(Flyweight Pattern) 优化资源配置,
减少重复浪费
共享资源池 全国社保联网 String、Integer、ObjectPool
组合模式(Composite Pattern) 人在一起叫团伙,
心在一起叫团队
统一整体和个体 组织架构树 HashMap、SqlNode
适配器模式(Adapter Pattern) 万能充电器 兼容转换 电源适配 AdvisorAdapter、HandlerAdapter
桥接模式(Bridge Pattern) 约定优于配置 不允许用继承 DriverManager
委派模式(Delegate Pattern) 这个需求很简单,
怎么实现我不管
只对结果负责 授权委托书 ClassLoader、
BeanDefinitionParserDelegate
模板模式(Template Pattern) 流程全部标准化,
需要微调请覆盖
逻辑复用 把大象装进冰箱 JdbcTemplate、HttpServlet
策略模式(Strategy Pattern) 条条大道通北京,
具体哪条你来定
把选择权交给用户 选择支付方式 Comparator、
InstantiationStrategy
责任链模式(Chain of Responsibility Pattern) 各人自扫门前雪,
莫管他人瓦上霜
解耦处理逻辑 踢皮球 FilterChain、Pipeline
迭代器模式(Iterator Pattern) 流水线上坐一天,
每个包裹扫一遍
统一对集合的访问方式 逐个检票进站 Iterator
命令模式(Command Pattern) 运筹帷幄之中,
决胜千里之外
解耦请求和处理 遥控器 Runnable、TestCase
状态模式(State Pattern) 状态驱动行为,
行为决定状态
绑定状态和行为 订单状态跟踪 Lifecycle
备忘录(Memento Pattern) 失足不成千古恨,
想重来时就重来
备份,后悔机制 草稿箱 StateManageableMessageContext
中介者(Mediator Pattern) 联系方式我给你,
怎么搞定我不管
统一管理网状资源 朋友圈 Timer
解释器模式(Interpreter Pattern 我想说“方言”,
一切解释权归我
实现特定语法解析 摩斯密码 Pattern、ExpressionParser
观察者模式(Observer Pattern) 到点就通知我 解耦观察者与被观察者 闹钟 ContextLoaderListener
访问者模式(Visitor Pattern) 横看成岭侧成峰,
远近高低各不同
解耦数据结构和数据操作 KPI考核 FileVisitor、BeanDefinitionVisitor

在《设计模式就该这样学》一书中,还有大量的UML图及易混淆的设计模式对比案例分析,也欢迎大家关注。

在日常应用中,设计模式从来都不是单个设计模式独立使用的。在实际应用中,通常多个设计模式混合使用,你中有我,我中有你。下图完整地描述了设计模式之间的混用关系,希望对大家有所帮助。

本文计划1个月(即2021年11月31日前)连载完毕,请小伙伴们持续关注本文更新,大家可以先关注和收藏本文,感谢您的支持! 关注微信公众号『 Tom弹架构 』回复“设计模式”可获取完整源码。 下一个连载专题预告《Spring核心原理与源码分析》。

本文为“Tom弹架构”原创,转载请注明出处。技术在于分享,我分享我快乐!

如果本文对您有帮助,欢迎关注和点赞;如果您有任何建议也可留言评论或私信,您的支持是我坚持创作的动力。关注微信公众号『 Tom弹架构 』可获取更多技术干货!

1个月连载30个设计模式真实案例(附源码),挑战年薪60W不是梦的更多相关文章

  1. 【SSH网上商城项目实战30】项目总结(附源码下载地址)

    项目基本完成了,加上这个总结,与这个项目相关的博客也写了30篇了,积少成多,写博客的过程是固化思路的一个过程,对自己很有用,同时也能帮助别人.顺便说个题外话,在学习的过程中肯定会遇到很多异常出现,我们 ...

  2. 业务类接口在TCP,HTTP,BLL模式下的实例 设计模式混搭 附源码一份

    业务类接口在TCP,HTTP,BLL模式下的实例 设计模式混搭 附源码一份 WinForm酒店管理软件--框架这篇随笔可以说是我写的最被大家争议的随笔,一度是支持和反对是一样的多.大家对我做的这个行业 ...

  3. JAVA设计模式-动态代理(Proxy)源码分析

    在文章:JAVA设计模式-动态代理(Proxy)示例及说明中,为动态代理设计模式举了一个小小的例子,那么这篇文章就来分析一下源码的实现. 一,Proxy.newProxyInstance方法 @Cal ...

  4. C# 30分钟完成百度人脸识别——进阶篇(文末附源码)

    距离上次入门篇时隔两个月才出这进阶篇,小编惭愧,对不住关注我的卡哇伊的小伙伴们,为此小编用这篇博来谢罪. 前面的准备工作我就不说了,注册百度账号api,创建web网站项目,引入动态链接库引入. 不了解 ...

  5. 从设计模式角度看OkHttp源码

    前言 说到源码,很多朋友都觉得复杂,难理解. 但是,如果是一个结构清晰且完全解耦的优质源码库呢? OkHttp就是这样一个存在,对于这个原生网络框架,想必大家也看过很多很多相关的源码解析了. 它的源码 ...

  6. Android设计模式系列(2)--SDK源码之观察者模式

    观察者模式,是一种非常常见的设计模式,在很多系统中随处可见,尤其是涉及到数据状态发生变化需要通知的情况下.本文以AbstractCursor为例子,展开分析.观察者模式,Observer Patter ...

  7. Android设计模式系列(3)--SDK源码之单例模式

    单例模式,可以说是GOF的23种设计模式中最简单的一个.这个模式相对于其他几个模式比较独立,它只负责控制自己的实例化数量单一(而不是考虑为用户产生什么样的实例),很有意思,是一个感觉上很干净的模式,本 ...

  8. Android设计模式系列(1)--SDK源码之组合模式

    Android中对组合模式的应用,可谓是泛滥成粥,随处可见,那就是View和ViewGroup类的使用.在android UI设计,几乎所有的widget和布局类都依靠这两个类.组合模式,Compos ...

  9. spring源码分析系列 (15) 设计模式解析

    spring是目前使用最为广泛的Java框架之一.虽然spring最为核心是IOC和AOP,其中代码实现中很多设计模式得以应用,代码看起来简洁流畅,在日常的软件设计中很值得借鉴.以下是对一些设计模式的 ...

随机推荐

  1. Pycharm新建模板默认添加作者时间等信息(逼格更高,好像很历害的样子)

    在pycharm使用过程中,关于代码编写者的一些个人信息快捷填写,使用模板的方式比较方便. 方法如下: 1.打开pycharm,选择File-Settings 2.选择Editor--Color&am ...

  2. 深入浅出WPF-09.Command(命令)

    命令 1)命令系统的基本元素 命令(Command),WPF的命令实际上就是实现了ICommand接口的类,平时使用最多的是RoutedCommand类 命令源(Command Source),即命令 ...

  3. aizhan查询旁IP网站脚本

    <?php print_r("-------------------------\r\n"); print_r("-------爱站旁站查询------\r\n&q ...

  4. 踩坑系列《三》 java -version 报错出现Error occurred during initialization of VM java/lang/NoClassDefFoundError:

    之前导入一个项目,因为该项目Spring版本过低,只能适用于1.7版本,装了jdk1.7版本.安装配置好后,打开cmd窗口,执行 java -version 指令发现没像正常一样显示版本信息,而是报了 ...

  5. WebMagic 爬虫技术

    WebMagic WebMagic 介绍 WebMagic基础架构 Webmagic 的结构分为 Downloader.PageProcessor.Scheduler.Pipeline四大组件,并由 ...

  6. HTML选择器的四种使用方法

    选择器<style> 为了让.html代码更加简洁,这里引入选择器style 本文总共介绍选择器的四种使用方式 一.选择器的四种形式 1.ID选择器 id表示身份,在页面元素中的id不允许 ...

  7. 第29篇-调用Java主类的main()方法

    在第1篇中大概介绍过Java中主类方法main()的调用过程,这一篇介绍的详细一点,大概的调用过程如下图所示. 其中浅红色的函数由主线程执行,而另外的浅绿色部分由另外一个线程执行,这个线程最终也会负责 ...

  8. 接口自动化-Python3+request上传文件,发送multipart/form-data编码

    1.安装requests_toolbelt   pip install requests-toolbelt 2.发送文件中的数据 from requests_toolbelt import Multi ...

  9. 2021年3月-第02阶段-前端基础-HTML+CSS阶段-Day02

    HTML5 第二天 一.rotate 2d旋转指的是让元素在2维平面内顺时针旋转或者逆时针旋转 使用步骤: 给元素添加转换属性 transform 属性值为 rotate(角度) 如 transfor ...

  10. 【数据结构】<栈的应用>回文判断

    通过栈与队列相关内容的学习,我们知道,栈是"先进后出"的线性表,而队列是"先进先出"的线性表.可以通过构造栈与队列来实现在这一算法.将要判断的字符序列依次压栈和 ...