本文所有内容均节选自《设计模式就该这样学》
序言
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)>> 应用桥接模式设计简单的音讯零碎 | 2012/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)>> 手写自定义迭代器,秒懂迭代器底层原理 | 2021/11/15 已更新 |
Tom 弹架构:命令模式(Command Pattern)>> 应用命令模式重构播放器管制条 | 2021/11/22 已更新 |
Tom 弹架构:状态模式(State Pattern)>> 彻底搞懂 Spring 状态机原理,实现订单与物流解耦 | 2021/11/16 已更新 |
Tom 弹架构:备忘录模式(Memento Pattern)>> 100 行代码,轻松搞定文本编辑器中草稿箱 | 2021/11/23 已更新 |
Tom 弹架构:中介者模式(Mediator Pattern)>> 微信和 QQ 这么多群,该如何治理好友关系? | 2021/11/24 已更新 |
Tom 弹架构:解释器模式(Interpreter Pattern)>> 这个无敌设计,能够解析并运算任意数学表达式 | 2021/11/18 已更新 |
Tom 弹架构:观察者模式(Observer Pattern)>> 基于 Guava API 实现异步告诉和事件回调 | 2021/11/17 已更新 |
Tom 弹架构:访问者模式(Visitor Pattern)>> 彻底搞懂访问者模式的动态、动静和伪动静分派 | 2021/11/24 已更新 |
7 新设计模式
题目 | 备注 |
---|---|
Tom 弹架构:对象池模式(Object Pool Pattern) | 2021/11/25 已更新 |
Tom 弹架构:规格模式(Specification Pattern) | 2021/11/25 已更新 |
Tom 弹架构:空对象模式(Null Object Pattern) | 2021/11/25 已更新 |
Tom 弹架构:雇工模式(Employee Pattern) | 2021/11/25 已更新 |
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 |
不论是面试也好,还是日常开发也好,置信大家都曾经胸有成竹、信念满满了。然而从笔者的架构教训和教学经验总结来看,还有很多小伙伴对一些设计模式常常混同难懂。以下内容将是我对设计模式的最精髓总结,收集了我在教学过程中很多来自学员的疑难,对各种容易混同的设计模式进行比拟,并总结整顿了以下内容,心愿帮忙大家在当前的设计选型中可能乘风破浪,如履平地。如果你在浏览本书之前,对设计模式较为相熟,本章内容能够帮忙你坚固加深了解。
## 9 创立型设计模式比照
9.1 工厂办法模式与形象工厂模式比照
比照 | 阐明 |
---|---|
共同点 | 1. 都属于创立型设计模式。 2. 职责雷同 |
不同点 | 所创立产品的扩大水平不同:工厂办法模式只能单向维度扩大产品;而形象工厂模式能够让产品等级构造和产品族的互相扩大,而且能够多维度扩大(至多是二维扩大) |
关联性 | 形象工厂很多时候不肯定是接口,而是抽象类;工厂办法类个别作为形象工厂类的子类 |
类图比照 | |
类图解释 | 从类图上看,形象工厂模式中的形象产品能够是多个维度的,而工厂办法模式中的形象产品是单维度的。因而形象工厂模式中的产品能够反对多维度扩大,而工厂办法模式中的产品只能单维度扩大。一个形象工厂能够创立同一产品族下的多个形象产品,而工厂办法模式并没有引入产品族的概念,只有是形象产品的实现类都能够创立 |
9.2 简略工厂模式与单例模式比照
比照 | 阐明 |
---|---|
共同点 | 1. 都属于创立型设计模式。 2. 都会提供对外的获取对象的办法 |
不同点 | 职责不同:单例模式的职责是确保一个类在 Java 虚拟机里只有一个对象,整个零碎共享这个对象;简略工厂模式的职责是封装对象的创立细节 |
关联性 | 在理论业务代码中,通常把工厂类设计为单例对象 |
类图比照 | |
类图解释 | 从类图上看,单例模式和简略工厂模式并没有间接的关联 |
9.3 简略工厂模式与建造者模式比照
比照 | 阐明 |
---|---|
共同点 | 1. 都属于创立型设计模式。 2. 职责雷同,都是将创立产品的细节封装起来 |
不同点 | 1. 目标不同:简略工厂模式关注创立一个残缺的规范产品,而建造者模式更关注创立个性化的产品。 2. 产品的复杂度不同:简略工厂模式创立的个别都是繁多性质的产品,建造者模式能够创立复合型产品。一般来说,简略工厂模式创立的产品对象粒度比拟粗,建造者模式创立的产品对象粒度更细 |
关联性 | 在理论业务代码中,通常把工厂类设计为单例对象 |
类图比照 | |
类图解释 | 从类图上看,建造者模式比简略工厂模式多了一个建造者类。对于客户端而言,用户在调用 build() 办法之前都只是对产品参数的预设。而在简略工厂模式中,没有预设参数的动作,间接调用创立产品的办法获取产品的实例 |
10 结构型设计模式比照
10.1 装璜器模式与代理模式比照
比照 | 阐明 |
---|---|
共同点 | 1. 都属于结构型设计模式。 2. 都是包装器模式的实现。 3. 都是为了达到性能加强的目标 |
不同点 | 1. 实现模式不同:代理模式通过组合实现性能加强和扩大,装璜器模式通过继承实现加强和扩大。 2. 目标不同:代理模式着重代理的过程管制,而装璜器模式则是对类性能的增强或削弱,更重视类性能的变动。 3. 可扩大水平不同:装璜器模式的代码扩大灵便度更大,代理模式的扩大相对来说依赖性更强 |
关联性 | 装璜器模式能够说是动态代理模式的一个非凡利用 |
类图比照 | |
类图解释 | 从类图上看,装璜器模式中会设计一个形象的组件,前面不论是装璜器还是具体的组件,都是形象组件的实现类,属于同一继承体系,性能扩大是在具体的装璜器中实现的。而代理模式用的是硬编码,性能的扩大简略粗犷 |
10.2 装璜器模式与门面模式比照
比照 | 阐明 |
---|---|
共同点 | 1. 都属于创立型设计模式。 2. 都是包装器模式的实现 |
不同点 | 目标不同:装璜器模式的次要目标是对立多个子系统的拜访入口,承当肯定的动态代理作用,大部分时候也会用到委派模式。装璜器模式的次要目标是性能扩大,而且扩大的类与指标类肯定是同宗同源的 |
关联性 | 从代码构造上看,二者都是包装器模式的一种实现,二者也都会用到动态代理 |
类图比照 | |
类图解释 | 从类图上看,门面模式中的门面类更像是一个万能的类,看上去涵盖了所有子系统的性能。而装璜器模式更合乎繁多职责准则 |
10.3 装璜器模式与适配器模式比照
比照 | 阐明 |
---|---|
共同点 | 1. 都属于结构型设计模式。 2. 都是包装器模式的实现 |
不同点 | 1. 代码构造不同:装璜器模式包装的都是本人的兄弟类,同宗同源;而适配器模式则是将一个非本家族的对象假装起来。 2. 设计目标不同:适配器模式的意义是将一个接口转变成另一个接口,通过扭转接口来达到重复使用的目标;而装璜器模式不是要扭转被装璜对象的接口,而是恰好要放弃原有的接口,然而加强原有对象的性能,或者扭转原有对象的解决形式,从而晋升性能 |
关联性 | 装璜器模式和适配器模式只有构造上容易混同,在具体业务场景中还是很容易辨别的 |
类图比照 | |
类图解释 | 从类图上看,没有太多的类似点。装璜器模式多了一个形象装璜者,便于子类扩大。而适配器模式没有形象装璜者这一层,间接扩大接口 |
10.4 适配器模式与代理模式比照
比照 | 阐明 |
---|---|
共同点 | 1. 都属于结构型设计模式。 2. 都是包装器模式的实现。 3. 二者都起到了暗藏和爱护原类的作用 |
不同点 | 目标不同:适配器模式次要解决兼容问题,会保留被适配对象曾经存在的办法并持续对外开放调用;而代理模式次要是为了性能加强,指标类的办法不会间接提供给用户调用,而是调用代理类的办法取得加强后的后果 |
关联性 | 对象适配器就是动态代理的一种实现 |
类图比照 | |
类图解释 | 从类图来看,代理模式中的指标类和代理类继承同一父类,而适配器模式中只有适配器类才继承指标接口 |
11 行为型设计模式比照
11.1 策略模式与模板办法模式比照
比照 | 阐明 |
---|---|
共同点 | 1. 都属于行为型设计模式。 2. 都能够用来拆散高层的算法和低层的具体实现细节,容许高层的算法独立于它的具体实现细节重用 |
不同点 | 1. 凋谢水平不同:策略模式容许外界调用其接口办法,而模板办法模式则限度接口办法只能在子类调用。 2. 办法控制权不同:模板办法模式采纳继承的形式实现算法的异构,其关键点就是将算法封装在形象基类中,并将不同的算法实现细节放在子类中实现,控制权在用户。而模板办法模式合乎依赖倒置准则,父类调用子类的操作,底层模块实现高层模块申明的接口。这样控制权在父类,底层模块要依赖高层模块 |
关联性 | 有时候会混合应用,模板办法模式中可能设计的钩子办法,就是某一个策略的实现 |
类图比照 | |
类图解释 | 从类图来看,在策略模式中的策略类,是实现策略形象接口的全副办法。而在模板办法模式中,具体的实现类只实现模板类的局部办法,模板类通常为抽象类,而非接口 |
11.2 策略模式与命令模式比照
比照 | 阐明 |
---|---|
共同点 | 1. 都属于行为型设计模式。 2. 都须要对外提供一个性能清单给用户抉择 |
不同点 | 业务场景不同:当不应用命令模式时,申请和解决的代码是写在一起的,但通常会升高调用者的体验,因而命令模式通常用于解耦申请和解决的场景。应用命令模式个别会有一个回调,反馈和处理结果。而策略模式则是封装算法,提供固定好的选项,让用户参加到业务的执行过程中,抉择不同的策略最终会失去同一类型的后果。因为每一种策略都是能够互相替换的 |
关联性 | 命令模式外部的有些逻辑解决能够设计成策略模式 |
类图比照 | |
类图解释 | 从类图来看,一个命令在模式上很像一种策略。只是命令模式多了一个接收者角色。然而在命令模式中,每条命令都是不能互相替换的,而在策略模式中,每种策略都是能够互相替换的 |
11.3 策略模式与委派模式比照
比照 | 阐明 |
---|---|
共同点 | 都属于行为型设计模式 |
不同点 | 关注点不同:策略模式关注策略是否能互相代替,而委派模式更关注散发和调度的过程 |
关联性 | 委派模式外部通常会用到策略切换的上下文容器 |
类图比照 | |
类图解释 | 从类图上看,策略模式中上下文容器只是算法策略的抉择切换所在,不须要实现策略接口。委派模式中委派者和被委派者实现了同一个接口 |
11.4 桥接模式与适配器模式比照
比照 | 阐明 |
---|---|
共同点 | 1. 都属于行为型设计模式。 2. 代码组织构造相似:适配器模式和桥接模式都是间接援用对象,因而能够使零碎更灵便,在实现上都波及从本身以外的一个接口向被援用的对象发出请求 |
不同点 | 1. 实用场景不同:适配器模式次要解决已有接口间的兼容问题,被适配的接口实现像是一个黑匣子,咱们不想也不能批改这个接口及其实现,也不可能管制其演变,只有相干的对象能与零碎定义的接口协同工作即可。适配器模式常常被用在与第三方产品的性能集成上,采纳适配器模式适应新类型的减少的形式是开发针对这个类型的适配器。桥接模式则不同,参加桥接的接口是稳固的,用户能够扩大和批改桥接中的类,然而不能扭转接口。 2. 设计准则不同:桥接模式不应用继承建立联系。而适配器模式中类适配器写法用的继承,对象适配器写法用的组合,接口适配器写法实际上用的也是继承,与桥接模式有由基本区别 |
关联性 | 依照 GoF 的说法,桥接模式和适配器模式用于设计的不同阶段,桥接模式用于设计的后期,即在设计类时将类布局为逻辑和实现两个大类,是它们能够别离精心演变的;而适配器模式用于设计实现之后,当发现设计实现的类无奈协同工作时,能够采纳适配器模式。然而很多状况下在设计初期就要思考适配器模式的应用,如波及大量第三方利用接口的状况 |
类图比照 | |
类图解释 | 从类图上看,桥接模式比适配器模式更简单,实际上多了一个桥接角色 |
11.5 桥接模式与组合模式比照
比照 | 阐明 |
---|---|
共同点 | 都属于行为型设计模式 |
不同点 | 目标不同:桥接模式的目标是将两个继承体系建设连贯,是为了满足共性的需要的。而组合模式的目标不是建设连贯,而是统一行动,对立成同一套 API 便于整体操作 |
关联性 | 桥接模式和组合模式关联性不大 |
类图比照 | |
类图解释 | 从类图上看,桥接模式绝对组合模式而言,其类图要简单得多。桥接模式中形象和实现不应用继承。而在组合模式中,所有的节点都具备独特的形象,只有这样才可能对立操作 |
12 跨类综合比照
12.1 享元模式与容器式单例模式比照
比照 | 阐明 |
---|---|
共同点 | 1. 都设计了一个缓存对象的容器。 2. 设计目标有相似之处,两者都是为了节俭内存开销 |
不同点 | 1. 类型不同:享元模式属于结构型设计模式,容器式单例模式属于创立型设计模式。 2. 对创建对象的管制粒度不同:享元模式能够再次创建对象,也能够取缓存对象。而单例模式则严格控制应用程序中只有一个实例对象。 3. 实现模式不同:享元模式能够通过本人实现对外部的单例,也能够在须要的时候创立更多的对象;单例模式是本身管制,须要减少不属于该对象自身的逻辑 |
关联性 | 享元模式能够看成是单例模式的扩大,能够把对象池的容器设置为单例。同时,把对象池所在的类设置为单例的工厂。 享元模式 = 单例模式 + 工厂模式 + 组合模式 |
类图比照 | |
类图解释 | 从类图上看,享元模式的类图比单例模式要简单,然而都提供了一个获取对象的办法 |
12.2 建造者模式与装璜器模式比照
比照 | 阐明 |
---|---|
共同点 | 都有扩大装璜的作用 |
不同点 | 1. 类型不同:建造者模式属于创立型设计模式,装璜器模式属于结构型设计模式。 2. 利用场景不同:建造者模式针对构建简单对象,且构建过程不稳固,强调对象创立步骤的个性化,一般来说会有标配;而装璜器模式针对建造过程非常稳固的状况,采纳大桶套小桶 |
关联性 | 二者很少会呈现混合应用的状况 |
类图比照 | |
类图解释 | 从类图上看,并没有太多的类似点 |
12.3 策略模式与简略工厂模式比照
比照 | 阐明 |
---|---|
共同点 | 客户端调用形式雷同:两者都是通过传入参数进行配置的。 |
不同点 | 1. 类型不同:策略模式属于行为型设计模式,简略工厂模式属于创立型设计模式。 2. 侧重点不同:简略工厂模式则是通过传参抉择创立出须要的对象,而策略模式则是通过传参配置出须要的行为算法。一个是对象创立,另一个是行为算法的替换。 3. 设计逻辑不同:两者的差异很奥妙,简略工厂模式是间接创立具体的对象并用该对象去执行相应的动作。而策略模式设计一个上下文(Context)类,将操作给了上下文类,策略类外部没有创立具体的对象,从而实现代码的进一步封装,客户端代码并不需要晓得具体的实现过程 |
关联性 | 一般来说,二者会组合应用,具体策略将由工厂来创立 |
类图比照 | |
类图解释 | 从类图上看,策略模式和简略工厂模式十分类似,都通过多态来实现不同子类的选取,这种思维应该是从程序的整体看进去的 |
12.4 策略模式与适配器模式比照
比照 | 阐明 |
---|---|
共同点 | 都是通过找到曾经存在的、运行良好的类来实现接口的 |
不同点 | 1. 类型不同:策略模式属于行为型设计模式,适配器模式属于结构型设计模式。 2. 目标不同:策略模式把一系列算法封装起来,提供一个对立的接口给客户,并使这些算法能够相互间替换;而适配器模式将一个类的接口转换成客户心愿的另外一个接口,从而使本来因接口不兼容不能一起工作的类能够一起工作。 3. 客户单端调用形式不同:策略模式的所有策略都须要裸露进来,由客户端决定应用哪一种策略。而适配器模式是定义好接口的实现形式及外部须要援用的类,客户端间接调用适配器的办法 |
关联性 | 策略模式很多时候都和适配器模式联合应用,把具体适配器作为具体策略,用户抉择不同策略从而调用不同的适配器办法 |
类图比照 | |
类图解释 | 从类图上看,策略模式中办法的形参为接口对象,实参为接口的实现类。而适配器模式中在适配器中定义适配者来辅助实现接口 |
12.5 中介者模式与适配器模式比照
比照 | 阐明 |
---|---|
共同点 | 二者实质上都是一样的,在一个类中调用另一个类中的办法,从而缩小耦合 |
不同点 | 1. 类型不同:中介者模式属于行为型设计模式,适配器模式属于结构型设计模式。 2. 目标不同:中介者模式次要实现资源协调,而适配器模式次要解决兼容问题。 3. 代码构造不同:中介者模式肯定是用组合的模式实现代码复用的,所有人可能都持有中介者的援用:而适配器模式能够用继承的形式实现,也能够用组合的形式来实现代码复用 |
关联性 | 二者并没有显著的关联性 |
类图比照 | |
类图解释 | 从类图上看,适配器采纳的是对象适配器的类图,适配者和被适配者是组合复用的关系。中介者模式中具体的共事类都是持有中介者的援用。适配者和中介者都实现了一个接口(形象) |
12.6 中介者模式与代理模式比照
比照 | 阐明 |
---|---|
共同点 | 都具备爱护指标对象的个性 |
不同点 | 1. 类型不同:中介者模式属于行为型设计模式,代理模式属于结构型设计模式。 2. 干涉水平不同:如果说代理模式是“媒婆”,那么中介者模式就是“不负责任的媒婆”。 3. 职责不同:代理模式的职责是性能加强,不仅要将指标对象和代理对象建立联系,代理对象还要参加过程。而中介者模式中的中介者只负责牵线搭桥,建立联系,不参加具体的过程 |
关联性 | 中介者模式是一种面向更加简单的对象关系的全权动态代理(委托) |
类图比照 | |
类图解释 | 从类图上看,Proxy 类和 Mediator 都具备中介的性能,能够达到爱护指标类的作用 |
12.7 中介者模式与桥接模式比照
比照 | 阐明 |
---|---|
共同点 | 都具备将两个对象建立联系的个性 |
不同点 | 1. 类型不同:中介者模式属于行为型设计模式,桥接模式属于结构型设计模式。 2. 实用场景不同:桥接模式只实用于将两个维度建设连贯;而中介者模式能够将多个维度建设连贯 |
关联性 | 中介者模式是一种更为简单的桥接模式,中介者能够和网状结构的对象建设连贯,而桥接模式只能和两个维度的对象建设连贯 |
类图比照 | |
类图解释 | 从类图上看,中介者模式和桥接模式还是十分类似的,只是中介者模式中采纳的是组合复用,而桥接模式中采纳的是继承复用。能够说中介者模式是桥接模式的升级版 |
12.8 桥接模式与命令模式比照
比照 | 阐明 |
---|---|
共同点 | 都是为了达到解耦的目标 |
不同点 | 1. 类型不同:桥接模式属于结构型设计模式,命令模式属于行为型设计模式。 2. 目标不同:桥接模式须要一个两头的实现类,以达到形象和具体之间解耦的目标。而命令模式须要一个形象的两头类,只是为了标准,达到申请和处了解耦的目标 |
关联性 | 桥接模式和命令模式组合应用的场景不常见 |
类图比照 | |
类图解释 | 从类图上看,桥接模式通过形象角色来与形象维度和具体维度建设连贯,而命令模式通过封装命令对象,将调用者角色和接收者角色建设连贯,二者别离实用于不同的业务场景 |
12.9 委派模式与门面模式比照
比照 | 阐明 |
---|---|
共同点 | 从代码构造上看,都是包装器模式,也是一种动态代理,都具备包装对象的个性 |
不同点 | 1. 类型不同:委派模式属于行为型设计模式,门面模式属于结构型设计模式。 2. 侧重点不同:委派模式针对行为上的对立调度和散发,而门面模式是针对组织构造上的对立入口 |
关联性 | 在门面模式中,可能会用到委派模式实现工作散发 |
类图比照 | |
类图解释 | 从类图上看,委派模式和门面模式十分类似,只是在委派模式中多了一个接口,而门面模式没有一个公共的接口 |
12.10 委派模式与代理模式比照
比照 | 阐明 |
---|---|
共同点 | 都有爱护指标对象的个性 |
不同点 | 1. 类型不同:委派模式属于行为型设计模式,代理模式属于结构型设计模式。 2. 职责不同:委派模式尽管构造上是一种全权的动态代理,但对指标类的性能不做任何的加强;而代理模式中的代理类肯定会对指标类进行性能加强 |
关联性 | 委派模式就是全权的动态代理,不做任何的代码加强 |
类图比照 | |
类图解释 | 从类图上看,委派模式和代理模式简直统一。只是委派模式是一个类代理多个指标类,而代理模式是一个类只代理一个指标类 |
在《设计模式就该这样学》一书中,还有大量的 UML 图及易混同的设计模式比照案例剖析,也欢送大家关注。
在日常利用中,设计模式素来都不是单个设计模式独立应用的。在理论利用中,通常多个设计模式混合应用,你中有我,我中有你。下图残缺地形容了设计模式之间的混用关系,心愿对大家有所帮忙。
大家能够先关注和珍藏本文,感谢您的反对! 关注微信公众号『Tom 弹架构』回复“设计模式”可获取残缺源码。。
本文为“Tom 弹架构”原创,转载请注明出处。技术在于分享,我分享我高兴!
如果本文对您有帮忙,欢送关注和点赞;如果您有任何倡议也可留言评论或私信,您的反对是我保持创作的能源。关注微信公众号『Tom 弹架构』可获取更多技术干货!