各设计模式总结与对比

GoF(Gang of Four) 23种设计模式

《Design Patterns: Elements of Reusable Object-Oriented Software》(即后述《设计模式》一书)。
由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides合著(Addison-Wesley,1995)。
GoF的设计模式是Java基础知识和J2EE框架知识之间一座隐性的桥。


使用方式分类(按可能使用频率排序)

  • 创建型

  • 工厂方法模式
  • 抽象工厂模式
  • 建造者模式
  • 单例模式
  • 原型模式

创建型设计模式总结

设计模式 一句话归纳 目的 生活案例 框架源码举例
工厂模式 产品标准化,生成更高效 封装创建细节 实体工厂 LoggerFactory、BeanFactory
单例模式 Only one 保证独一无二 CEO Calender、Runtime
原型模式 多重影分身 高效创建对象 克隆 ArrayList、PrototypeBean
建造者模式 定制化配置 开放个性配置步骤 选配 StringBuilder、BeanDefinitionBuilder

  • 结构型

  • 适配器模式
  • 装饰器模式
  • 代理模式
  • 门面模式
  • 组合模式
  • 享元模式
  • 桥接模式

结构型设计模式总结

设计模式 一句话归纳 目的 生活案例 框架源码举例
代理模式 没有资源没时间,得找媒婆 增强职责 媒婆 Spring ProxyFactoryBean、
Spring JdkDynamicAopProxy、
Spring CglibAopProxy
门面模式 打开一扇门,走向全世界 统一访问入口 前台 Spring JdbcUtils、
Tomcat RequestFacade
装饰器模式 他大舅他二舅,都是他舅 灵活扩展、同宗同源 煎饼 JDK BufferedReader、
JDK InputStream
享元模式 优化资源配置,减少重复浪费 共享资源池 全国社保联网 JDK String、Integer、ObjectPool
组合模式 人在一起叫团伙,心在一起叫团队 统一整体和个体 组织架构树 JDK HashMap、
Mybatis SqlNode
适配器模式 适合自己的,才是最好的 兼容转换(求同存异) 电源适配 Spring AdvisorAdapter、
Spring MVC HandlerAdapter
桥接模式 约定优于配置 不允许用继承 JDK DriverManager

  • 行为型

  • 策略模式
  • 观察者模式
  • 责任链模式
  • 解释器模式
  • 模板方法模式
  • 迭代器模式
  • 中介者模式
  • 命令模式
  • 访问者模式
  • 备忘录模式
  • 状态模式

行为型设计模式总结

设计模式 一句话归纳 目的 生活案例 框架源码举例
委派模式 这个需求很简单,怎么实现我不管 只对结果负责 授权委托书 JDK ClassLoader、
Spring BeanDefinitionParserDelegate
模板模式 流程全部标准化,需要微调请覆盖 逻辑复用 做菜的步骤 Spring JdbcTemplate、
Servlet HttpServlet
策略模式 条条大路通罗马,具体哪条你来定 把选择权交给用户 选择支付方式 JDK Comparator、
Spring InstantiationStrategy
责任链模式 各人自扫门前雪,莫管他人瓦上霜 解耦处理逻辑 踢皮球 JavaX FilterChain、
Netty Pipeline
迭代器模式 流水线上坐一天,每个包裹扫一遍 统一集合访问 统一刷脸进站 JDK Iterator
命令模式 运筹帷幄之中,决胜千里之外 解耦请求和处理 遥控器 JDK Runnable、
TestCase
状态模式 状态驱动行为,行为决定状态 绑定状态和行为 订单状态跟踪 JSF Lifecycle
备忘录模式 “后悔药” 备份 草稿箱 Spring StateManageableMessageContext
中介者模式 联系方式我给你,怎么搞定我不管 统一管理网状资源 朋友圈 JDK Timer
解释器模式 我想说“方言” 实现特定语法解析 摩斯密码 JDKPattern、
Spring ExpressionParser
观察者模式 到点就通知我 解耦观察者与被观察者 闹钟 Spring ContextLoaderListener
访问者模式 横看成岭侧成峰,远近高低各不同 解耦数据结构和数据操作 KPI考核 JDK FileVisitor、
Spring BeanDefinitionVisitor

容易混淆的设计模式

创建型 & 行为型 & 结构型

创建:对创建Java对象的形式提出的建议。
行为:对Java中的方法的使用提出的建议。
结构:对Java类的组合提出建议。

代理模式 & 中介者模式

代理:职责增强,不仅要建立联系,还要参与过程。
中介者:只负责牵线搭桥,建立联系。

代理模式 & 委派模式

代理:一定会有增强。
委派:全权的静态代理,不做任何的增强。没有任何的功能增强。

代理模式 & 装饰器模式

代理:组合实现功能增强和扩展。
装饰器:继承实现增强和扩展。

委派模式 & 责任链模式

委派:没有流程的概念,只需要拿到结果。
责任链:处理流程,处理流程可扩展可定制,最终结果由责任链中的某些Handler来决定。

命令模式 & 策略模式

命令:解耦请求和处理,会有一个回调,会有反馈和处理结果。本来请求和处理是可以写在一块的。
策略:固定好的选项,一定是同样的结果。一定要用户有参与。
共同点:都有一个用户不能确定的清单。

工厂方法 & 抽象工厂

工厂方法:产品扩展,单向维度。
抽象工厂:产品等级结构和产品族的相互扩展关系,多向维度,至少是二维。

桥接模式 & 适配器模式

桥接:不用继承建立联系。
适配器:类适配器用的继承、对象适配器用的组合、接口适配器实际上也是继承。

抽象工厂 & 模板方法

抽象工厂:形式上可能会出现抽象方法,但是并不能体现流程。
模板方法:也是有可能出现抽象方法,但是一定是某个流程中的一个步骤。

建造者模式 & 装饰器模式

建造者:强调对象创建步骤的个性化。一般来说会有标配。
装饰器:更加强调扩展性,大桶套小桶。

适配器模式 & 中介者模式

适配器:解决兼容问题,可以用继承,也可以用组合。
中介者:一定是用组合,所有人可能都持有中介者的引用。

桥接模式 & 中介者模式

共同点:不用继承,一定是用组合。
桥接:两个维度建立连接。
中介者:多维度建立连接(是一个更复杂的桥接模式的实现)。

桥接模式 & 组合模式

桥接:两个继承体系建立连接,反而就是为了满足个性的。
组合:目的不是为了建立连接,而是为了统一行动,统一一套API

门面模式 & 装饰器模式

门面:统一入口,背后很多个子系统,承担一定的静态代理作用。
装饰器:为了扩展,一定是同宗同源。

桥接模式 & 命令模式

桥接:需要一个中间类,这个中间类一定是有功能实现的。
命令:需要一个抽象的中间类,只是为了规范。

你可能感兴趣的:(各设计模式总结与对比)