掌握这30个设计模式真实案例,挑战年薪60W不是梦

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

本文节选自《设计模式就该这样学》


序言

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 创建型设计模式


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

6f43022fb4c4ea84157e6d976374cc04.png

1.2 结构型设计模式


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

981d99800897d20a18ca50256ed22e24.png

1.3 行为型设计模式


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

ab456250c7c1258f4fda69046e402f39.png

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

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

3 七大架构设计原则篇

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

4 创建型设计模式

5 结构型设计模式

6 行为型设计模式

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图及易混淆的设计模式对比案例分析,也欢迎大家关注。

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

6c7565ea4674e01442f98ad1a5827044.png

请小伙伴们持续关注本文更新,大家可以先关注和收藏本文,感谢您的支持!

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

如果本文对您有帮助,欢迎关注和点赞;如果您有任何建议也可留言评论或私信,您的支持是我坚持创作的动力。

相关文章
|
设计模式 存储 缓存
「全网最细 + 实战源码案例」设计模式——享元模式
享元模式(Flyweight Pattern)是一种结构型设计模式,旨在减少大量相似对象的内存消耗。通过分离对象的内部状态(可共享、不变)和外部状态(依赖环境、变化),它有效减少了内存使用。适用于存在大量相似对象且需节省内存的场景。模式优点包括节省内存和提高性能,但会增加系统复杂性。实现时需将对象成员变量拆分为内在和外在状态,并通过工厂类管理享元对象。
446 92
|
设计模式 缓存 应用服务中间件
「全网最细 + 实战源码案例」设计模式——外观模式
外观模式(Facade Pattern)是一种结构型设计模式,旨在为复杂的子系统提供一个统一且简化的接口。通过封装多个子系统的复杂性,外观模式使外部调用更加简单、易用。例如,在智能家居系统中,外观类可以同时控制空调、灯光和电视的开关,而用户只需发出一个指令即可。
332 69
|
设计模式 存储 算法
「全网最细 + 实战源码案例」设计模式——命令模式
命令模式(Command Pattern)是一种行为型设计模式,将请求封装成独立对象,从而解耦请求方与接收方。其核心结构包括:Command(命令接口)、ConcreteCommand(具体命令)、Receiver(接收者)和Invoker(调用者)。通过这种方式,命令的执行、撤销、排队等操作更易扩展和灵活。 适用场景: 1. 参数化对象以操作。 2. 操作放入队列或远程执行。 3. 实现回滚功能。 4. 解耦调用者与接收者。 优点: - 遵循单一职责和开闭原则。 - 支持命令组合和延迟执行。 - 可实现撤销、恢复功能。 缺点: - 增加复杂性和类数量。
426 14
「全网最细 + 实战源码案例」设计模式——命令模式
|
设计模式 存储 Java
「全网最细 + 实战源码案例」设计模式——责任链模式
责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,允许将请求沿着处理者链进行发送。每个处理者可以处理请求或将其传递给下一个处理者,从而实现解耦和灵活性。其结构包括抽象处理者(Handler)、具体处理者(ConcreteHandler)和客户端(Client)。适用于不同方式处理不同种类请求、按顺序执行多个处理者、以及运行时改变处理者及其顺序的场景。典型应用包括日志处理、Java Web过滤器、权限认证等。
288 13
「全网最细 + 实战源码案例」设计模式——责任链模式
|
设计模式
「全网最细 + 实战源码案例」设计模式——模式扩展(配置工厂)
该设计通过配置文件和反射机制动态选择具体工厂,减少硬编码依赖,提升系统灵活性和扩展性。配置文件解耦、反射创建对象,新增产品族无需修改客户端代码。示例中,`CoffeeFactory`类加载配置文件并使用反射生成咖啡对象,客户端调用时只需指定名称即可获取对应产品实例。
287 40
|
设计模式 算法 开发者
「全网最细 + 实战源码案例」设计模式——策略模式
策略模式(Strategy Pattern)是一种行为型设计模式,用于定义一系列可替换的算法或行为,并将它们封装成独立的类。通过上下文持有策略对象,在运行时动态切换算法,提高代码的可维护性和扩展性。适用于需要动态切换算法、避免条件语句、经常扩展算法或保持算法独立性的场景。优点包括符合开闭原则、运行时切换算法、解耦上下文与策略实现、减少条件判断;缺点是增加类数量和策略切换成本。示例中通过定义抽象策略接口和具体策略类,结合上下文类实现动态算法选择。
484 8
「全网最细 + 实战源码案例」设计模式——策略模式
|
设计模式 SQL 算法
「全网最细 + 实战源码案例」设计模式——模板方法模式
模板方法模式是一种行为型设计模式,定义了算法的骨架并在父类中实现不变部分,将可变部分延迟到子类实现。通过这种方式,它避免了代码重复,提高了复用性和扩展性。具体步骤由抽象类定义,子类实现特定逻辑。适用于框架设计、工作流和相似算法结构的场景。优点包括代码复用和符合开闭原则,缺点是可能违反里氏替换原则且灵活性较低。
347 7
「全网最细 + 实战源码案例」设计模式——模板方法模式
|
设计模式 Java 开发者
「全网最细 + 实战源码案例」设计模式——适配器模式
适配器模式(Adapter Pattern)是一种结构型设计模式,通过引入适配器类将一个类的接口转换为客户端期望的另一个接口,使原本因接口不兼容而无法协作的类能够协同工作。适配器模式分为类适配器和对象适配器两种,前者通过多重继承实现,后者通过组合方式实现,更常用。该模式适用于遗留系统改造、接口转换和第三方库集成等场景,能提高代码复用性和灵活性,但也可能增加代码复杂性和性能开销。
551 28
|
设计模式 缓存 Java
「全网最细 + 实战源码案例」设计模式——代理模式
代理模式(Proxy Pattern)是一种结构型设计模式,通过代理对象控制对目标对象的访问并添加额外功能。它分为静态代理和动态代理,后者包括JDK动态代理和CGLIB动态代理。JDK动态代理基于接口反射生成代理类,而CGLIB通过继承目标类生成子类。代理模式适用于延迟初始化、访问控制、远程服务、日志记录和缓存等场景,优点是职责分离、符合开闭原则和提高安全性,缺点是增加系统复杂性。
338 25
|
设计模式 存储 安全
「全网最细 + 实战源码案例」设计模式——组合模式
组合模式(Composite Pattern)是一种结构型设计模式,用于将对象组合成树形结构以表示“部分-整体”的层次结构。它允许客户端以一致的方式对待单个对象和对象集合,简化了复杂结构的处理。组合模式包含三个主要组件:抽象组件(Component)、叶子节点(Leaf)和组合节点(Composite)。通过这种模式,客户端可以统一处理简单元素和复杂元素,而无需关心其内部结构。适用于需要实现树状对象结构或希望以相同方式处理简单和复杂元素的场景。优点包括支持树形结构、透明性和遵循开闭原则;缺点是可能引入不必要的复杂性和过度抽象。
422 22