1个月连载30个设计模式真实案例(附源码),挑战年薪60W不是梦
本文所有内容均节选自《设计模式就该这样学》
本文自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不是梦的更多相关文章
- 【SSH网上商城项目实战30】项目总结(附源码下载地址)
项目基本完成了,加上这个总结,与这个项目相关的博客也写了30篇了,积少成多,写博客的过程是固化思路的一个过程,对自己很有用,同时也能帮助别人.顺便说个题外话,在学习的过程中肯定会遇到很多异常出现,我们 ...
- 业务类接口在TCP,HTTP,BLL模式下的实例 设计模式混搭 附源码一份
业务类接口在TCP,HTTP,BLL模式下的实例 设计模式混搭 附源码一份 WinForm酒店管理软件--框架这篇随笔可以说是我写的最被大家争议的随笔,一度是支持和反对是一样的多.大家对我做的这个行业 ...
- JAVA设计模式-动态代理(Proxy)源码分析
在文章:JAVA设计模式-动态代理(Proxy)示例及说明中,为动态代理设计模式举了一个小小的例子,那么这篇文章就来分析一下源码的实现. 一,Proxy.newProxyInstance方法 @Cal ...
- C# 30分钟完成百度人脸识别——进阶篇(文末附源码)
距离上次入门篇时隔两个月才出这进阶篇,小编惭愧,对不住关注我的卡哇伊的小伙伴们,为此小编用这篇博来谢罪. 前面的准备工作我就不说了,注册百度账号api,创建web网站项目,引入动态链接库引入. 不了解 ...
- 从设计模式角度看OkHttp源码
前言 说到源码,很多朋友都觉得复杂,难理解. 但是,如果是一个结构清晰且完全解耦的优质源码库呢? OkHttp就是这样一个存在,对于这个原生网络框架,想必大家也看过很多很多相关的源码解析了. 它的源码 ...
- Android设计模式系列(2)--SDK源码之观察者模式
观察者模式,是一种非常常见的设计模式,在很多系统中随处可见,尤其是涉及到数据状态发生变化需要通知的情况下.本文以AbstractCursor为例子,展开分析.观察者模式,Observer Patter ...
- Android设计模式系列(3)--SDK源码之单例模式
单例模式,可以说是GOF的23种设计模式中最简单的一个.这个模式相对于其他几个模式比较独立,它只负责控制自己的实例化数量单一(而不是考虑为用户产生什么样的实例),很有意思,是一个感觉上很干净的模式,本 ...
- Android设计模式系列(1)--SDK源码之组合模式
Android中对组合模式的应用,可谓是泛滥成粥,随处可见,那就是View和ViewGroup类的使用.在android UI设计,几乎所有的widget和布局类都依靠这两个类.组合模式,Compos ...
- spring源码分析系列 (15) 设计模式解析
spring是目前使用最为广泛的Java框架之一.虽然spring最为核心是IOC和AOP,其中代码实现中很多设计模式得以应用,代码看起来简洁流畅,在日常的软件设计中很值得借鉴.以下是对一些设计模式的 ...
随机推荐
- Pycharm新建模板默认添加作者时间等信息(逼格更高,好像很历害的样子)
在pycharm使用过程中,关于代码编写者的一些个人信息快捷填写,使用模板的方式比较方便. 方法如下: 1.打开pycharm,选择File-Settings 2.选择Editor--Color&am ...
- 深入浅出WPF-09.Command(命令)
命令 1)命令系统的基本元素 命令(Command),WPF的命令实际上就是实现了ICommand接口的类,平时使用最多的是RoutedCommand类 命令源(Command Source),即命令 ...
- aizhan查询旁IP网站脚本
<?php print_r("-------------------------\r\n"); print_r("-------爱站旁站查询------\r\n&q ...
- 踩坑系列《三》 java -version 报错出现Error occurred during initialization of VM java/lang/NoClassDefFoundError:
之前导入一个项目,因为该项目Spring版本过低,只能适用于1.7版本,装了jdk1.7版本.安装配置好后,打开cmd窗口,执行 java -version 指令发现没像正常一样显示版本信息,而是报了 ...
- WebMagic 爬虫技术
WebMagic WebMagic 介绍 WebMagic基础架构 Webmagic 的结构分为 Downloader.PageProcessor.Scheduler.Pipeline四大组件,并由 ...
- HTML选择器的四种使用方法
选择器<style> 为了让.html代码更加简洁,这里引入选择器style 本文总共介绍选择器的四种使用方式 一.选择器的四种形式 1.ID选择器 id表示身份,在页面元素中的id不允许 ...
- 第29篇-调用Java主类的main()方法
在第1篇中大概介绍过Java中主类方法main()的调用过程,这一篇介绍的详细一点,大概的调用过程如下图所示. 其中浅红色的函数由主线程执行,而另外的浅绿色部分由另外一个线程执行,这个线程最终也会负责 ...
- 接口自动化-Python3+request上传文件,发送multipart/form-data编码
1.安装requests_toolbelt pip install requests-toolbelt 2.发送文件中的数据 from requests_toolbelt import Multi ...
- 2021年3月-第02阶段-前端基础-HTML+CSS阶段-Day02
HTML5 第二天 一.rotate 2d旋转指的是让元素在2维平面内顺时针旋转或者逆时针旋转 使用步骤: 给元素添加转换属性 transform 属性值为 rotate(角度) 如 transfor ...
- 【数据结构】<栈的应用>回文判断
通过栈与队列相关内容的学习,我们知道,栈是"先进后出"的线性表,而队列是"先进先出"的线性表.可以通过构造栈与队列来实现在这一算法.将要判断的字符序列依次压栈和 ...