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
门面模式 & 装饰器模式
门面:统一入口,背后很多个子系统,承担一定的静态代理作用。
装饰器:为了扩展,一定是同宗同源。
桥接模式 & 命令模式
桥接:需要一个中间类,这个中间类一定是有功能实现的。
命令:需要一个抽象的中间类,只是为了规范。