设计模式 | Spring中用到的设计模式,你知道几个?
设计模式无处不在,因为它就来自于我们的日常生活,提炼于生活经验。
正握在你手中的手机,不能用220V的电压直接充电,需要一个专门的电源适配器(充电器)才行。摆在你桌上的电脑也是一样的,都需要“适配”。而 适配器模式 (Adapter Pattern)正是由此总结而来。
从一个问题出发,为什么Spring这么牛?
Spring 发展到今天,在Java开发中的地位毋庸置疑。人人都在用Spring,80%的开发者学完Java 就得学习Spring了。那Spring为啥这么牛呢?其中肯定很大一部分原因就是因为Spring是一个把设计模式用的淋漓尽致的框架。从类名中就能体现出来。
| 设计模式 | 举例 | |
|---|---|---|
| 工厂模式 | Factory | BeanFactory |
| 装饰者模式 | Wrapper | BeanWrapper |
| 代理模式 | Proxy | AopProxy |
| 委派模式 | Dispatcher | DispatcherServlet |
| 策略模式 | Handler | HandlerMapping |
| 适配器模式 | Adapter | HandlerAdpter |
| 模板模式 | Template | JdbcTemplate |
| 观察者模式 | Listener | ContextLoaderListener |
小伙伴们,赶紧打开你的idea,使用上面的关键词进行搜索,将会获得一个新的视角去审视我们的Spring源码了。前言就到这里,那我们就正式进入今天的主题,设计模式
设计模式的由来
现在我们谈论的设计模式,没有特别说明的话,通常上就是指的1995年GoF(Gang of Four 四人组)所编写的 Design Patterns: Elements of Reusable Object-Oriented Software 一书,该书包含了23种设计模式。 通常也被人称为GoF 23。
在这里大炮就不介绍全部了,网上一搜一大把,而且有些模式确实用的比较少。所以只列出常用的十种,也是比较重要的十种,大家看下,如果有不会的后面也会有专门的章节讲到的。
| 类型 | 名称 | 英文名 |
|---|---|---|
| 创建型 | 工厂模式 | Factory Pattern |
| 单例模式 | Singleton Pattern | |
| 原型模式 | Prototype Pattern | |
| 结构型 | 适配器模式 | Adapter Pattern |
| 装饰器 | Decorator Pattern | |
| 代理模式 | Proxy Pattern | |
| 行为型 | 策略模式 | Strategy Pattern |
| 模板模式 | Template Pattern | |
| 委派模式(不属于GoF 23) | Delegate Pattern | |
| 观察者模式 | Observer Pattern |
可能有些读者注意到上面委派模式,并不属于GoF 23。没错,设计模式并不局限于GoF提出的,毕竟他们也是基于个人经验总结出来的。如果哪天你突然脑中灵光一闪,通过自己的经验也总结出来一个模式,并且能很好地解决一些问题,那也是完全合理OK的。
为什么要使用设计模式
讲了这么多,为啥要用设计模式呢?我就是不用不行嘛?其实这两个问题,仔细思索就会发现它完完全全就是个伪命题。我们每个人都是在“不得不“ 和 “不自觉”的使用设计模式。我们来看Mybatis中的一个例子:

SqlSession是一个接口,这里定义了对数据库的一大堆基本操作。我们对数据库的操作都离不开它,这里我们不看具体实现,只分析结构。它有三个实现类:

重点关注这个默认的DefaultSqlSession是怎么创建的。我们还是只分析结构。

可以看到,创建的步骤是很多的,入参就有三个,还调用了好几个子方法,最终只是为了拿到DefaultSqlSession的实例,就是这句:
new DefaultSqlSession(configuration, executor, autoCommit);
试想,如果每个需要DefaultSqlSession的实例的调用者都需要写这么一大串,那得写多少重复代码?万一创建过程有改动,我们得改多少个地方?所以我们会很自然的想到把它抽到一个公共的地方,每次需要他,就去公共的地方拿就行了。即使有改动,也只需改动这个公共方法即可。平时我们的各种工具类,各种Util之类的,都是基于这个很直白,很自然的经验。
其实针对这个openSessionFromDataSource(),就是一个非常标准的工厂模式的体现:工厂生产一个标准化的产品,大家需要这个产品都来我这里拿就行了,并不需要关注其中的细节。而上面openSessionFromDataSource()方法,正是出自DefaultSqlSessionFactory,就是专门提供DefaultSqlSession实例的工厂。稍微看它一眼:

它重载了很多个openSession()方法,但最终都是调用openSessionFromDataSource()方法完成创建的。
从这个例子再次出发,我们尝试猜下:它是从一开始的现场造轮子,然后到自然而然的使用设计模式,来感受下演变过程,首先是发现问题:

然后我们很自然的想到,把这些相同的逻辑、代码,放到一个公共方法里头,openSessionFromDataSource()方法应运而生,但是这个方法总得放一个地方吧,肯定不能是在各自的Service里面,因为还是重复了嘛,所以很自然的新建一个类:

后面经过GoF的总结和提炼,它,Factory Pattern ,工厂模式就这么出现了。其他设计模式的诞生和这个是一样的,发现具有特征的问题=>解决问题=>提炼特征经验=>形成设计模式。
从这个过程我们可以体会到,是因为我们先去这么做了,经过提炼和总结,才有设计模式的诞生。
综上所述,不用设计模式也是可以正常实现我们需要的功能的。但是我们就是这么自然而然地使用了,毫无违和感。从这也能得出一个结论,也应证了这篇文章的引言部分:设计模式来源于经验(生活经验、开发经验)的总结。
总结
看了上面的例子,我们可以对设计模式做一些总结:
- 设计模式是生活中经验总结。
- 不使用设计模式也能解决问题,但容易让项目变成“屎山”,难以扩展和维护。使用设计模式能让代码变得“优雅”,易于维护、易于拓展,并且节省时间(生命)。
- GoF的发布的设计模式一书形成了一种标准。出现了很多的关键字,比如Factory、Adapter,后人使用设计模式都会使用这些关键字来命名。Spring源码就是一个很好地例子,所以想看懂Spring源码,一定要学习设计模式。
使用设计模式的准则:
不是为了用而强行使用设计模式,使用的过程应该是很自然的。诶,我需要用到这个模式才能很好的解决问题,所以我要用。
今天就到这里了,祝大家七夕快乐,没有对象的都能今晚脱单。下一篇就是单个设计模式的精讲篇了,我们下期再见~
往期推荐
原创不易,求个三连鼓励下吧
微信搜索 java-caidapao ,关注大炮~回复“面试题”,领取2020最新面试题
设计模式 | Spring中用到的设计模式,你知道几个?的更多相关文章
- Spring中用了哪些设计模式
1 简单工厂模式 又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一. 简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类. ...
- spring中用到哪些设计模式?
设计模式作为工作学习中的枕边书,却时常处于勤说不用的尴尬境地,也不是我们时常忘记,只是一直没有记忆. Spring作为业界的经典框架,无论是在架构设计方面,还是在代码编写方面,都堪称行内典范.好了,话 ...
- 【Spring】Spring中用到的设计模式
1.简单工厂 又叫静态工厂方法模式,不属于23种设计模式之一. 简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类. Spring中的BeanFactory就是简单工厂模式的 ...
- 了解一下Spring中用了哪些设计模式?这样回答面试官才稳
一:简单工厂模式 又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一. 简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类. ...
- Yii2设计模式——Yii2中用到哪些设计模式?
"Yii2设计模式"包含了两个方面的内容:1.设计模式,2.Yii2框架. <设计模式>一书虽然以JAVA语言来表达设计模式的思想,但是设计模式远不限制于某一种特定的语 ...
- Yii2 设计模式——Yii2 中用到哪些设计模式?
Yii 2 设计模式“包含了两个方面的内容:1. 设计模式,2. Yii 2 框架. <设计模式>一书虽然以JAVA语言来表达设计模式的思想,但是设计模式远不限制于某一种特定的语言,而是在 ...
- spring中用到哪些设计模式
1.工厂模式,这个很明显,在各种BeanFactory以及ApplicationContext创建中都用到了: 2.模版模式,这个也很明显,在各种BeanFactory以及ApplicationCon ...
- spring中用到的设计模式
http://www.cnblogs.com/pengmengnan/p/6717766.html 一 : 工厂模式工厂模式主要是为创建对象提供过度接口,以便将创建对象的具体 过程屏蔽隔离起来,达到提 ...
- Spring中用到了哪些设计模式?
谈谈Spring中都用到了哪些设计模式? JDK 中用到了那些设计模式?Spring 中用到了那些设计模式?这两个问题,在面试中比较常见.我在网上搜索了一下关于 Spring 中设计模式的讲解几乎都是 ...
随机推荐
- PHP constant() 函数
实例 返回一个常量的值: <?php//define a constantdefine("GREETING","Hello you! How are you tod ...
- C/C++编程笔记:C语言成绩管理系统!链式结构的管理系统源码分享
最近很多同学因为学校的要求,需要完成自己的那个C语言课程设计,于是就有很多人私信或者加我私聊我,问的最多的还是<学生成绩管理系统>,其实当你项目写多了你就会发现:其实各类的管理系统都离不开 ...
- yum自建离线仓库
1.步骤 centOS的安装包,完整版最好--everyhing版本 解压缩 将文件夹内Packages文件导入系统 执行命令如下: 1. mv ./Packages/ /mnt/ 2. create ...
- 学学Viewbinding
Viewbinding 1.环境需求 环境上,需要Android Studio 3.6 Canary 11+ 同样的Gradle也需要升级(这年头都4.0了,应该没有还在用低版本的了吧...) 2.配 ...
- ios 版本更新提示-硬更新/软更新
实现: 强制更新:每次弹框 非强制更新:一天提示一次 代码如下: 步骤一: 将检测更新写到APPDelegate的applicationDidBecomeActive中 步骤二: 检测是否需要更新 步 ...
- dos下mybatis自动生成代码
今天来介绍下怎么用mybatis-gennerator插件自动生成mybatis所需要的dao.bean.mapper xml文件,这样我们可以节省一部分精力,把精力放在业务逻辑上. 之前看过很多文章 ...
- WPF桌面程序在请求接口时如何防止被常用的抓包软件Fiddler抓包
问题:在我开发了一个WPF桌面应用程序的时候,由于涉及到登录等等操作通过Fiddler可以很直观的看到账号密码.首先问题有两点:1.数据提交的时候对于密码等重要的数据没有进行加密操作.2.没有防止抓包 ...
- echarts全国疫情统计可视化地图(第一阶段)
DBUtil.java package com.helloechart; import java.sql.Connection; import java.sql.DriverManager; impo ...
- 正确认识springcloud的作用。分布式从了解架构到springcloud支撑
转载于 https://www.cnblogs.com/williamjie/p/9369681.html 基于springCloud的分布式架构体系 Spring Cloud作为一套微服务治理的 ...
- PB级大规模Elasticsearch集群运维与调优实践
导语 | 腾讯云Elasticsearch 被广泛应用于日志实时分析.结构化数据分析.全文检索等场景中,本文将以情景植入的方式,向大家介绍与腾讯云客户合作过程中遇到的各种典型问题,以及相应的解决思路与 ...