设计模式 | Spring中用到的设计模式,你知道几个?

时间:2021-07-17 19:24:06

设计模式无处不在,因为它就来自于我们的日常生活,提炼于生活经验。

正握在你手中的手机,不能用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中的一个例子:

设计模式 | Spring中用到的设计模式,你知道几个?

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

设计模式 | Spring中用到的设计模式,你知道几个?

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

设计模式 | Spring中用到的设计模式,你知道几个?

可以看到,创建的步骤是很多的,入参就有三个,还调用了好几个子方法,最终只是为了拿到DefaultSqlSession的实例,就是这句:

new DefaultSqlSession(configuration, executor, autoCommit);

试想,如果每个需要DefaultSqlSession的实例的调用者都需要写这么一大串,那得写多少重复代码?万一创建过程有改动,我们得改多少个地方?所以我们会很自然的想到把它抽到一个公共的地方,每次需要他,就去公共的地方拿就行了。即使有改动,也只需改动这个公共方法即可。平时我们的各种工具类,各种Util之类的,都是基于这个很直白,很自然的经验。

其实针对这个openSessionFromDataSource(),就是一个非常标准的工厂模式的体现:工厂生产一个标准化的产品,大家需要这个产品都来我这里拿就行了,并不需要关注其中的细节。而上面openSessionFromDataSource()方法,正是出自DefaultSqlSessionFactory,就是专门提供DefaultSqlSession实例的工厂。稍微看它一眼:

设计模式 | Spring中用到的设计模式,你知道几个?

它重载了很多个openSession()方法,但最终都是调用openSessionFromDataSource()方法完成创建的。

从这个例子再次出发,我们尝试猜下:它是从一开始的现场造*,然后到自然而然的使用设计模式,来感受下演变过程,首先是发现问题:

设计模式 | Spring中用到的设计模式,你知道几个?

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

设计模式 | Spring中用到的设计模式,你知道几个?

后面经过GoF的总结和提炼,它,Factory Pattern ,工厂模式就这么出现了。其他设计模式的诞生和这个是一样的,发现具有特征的问题=>解决问题=>提炼特征经验=>形成设计模式

从这个过程我们可以体会到,是因为我们先去这么做了,经过提炼和总结,才有设计模式的诞生。

综上所述,不用设计模式也是可以正常实现我们需要的功能的。但是我们就是这么自然而然地使用了,毫无违和感。从这也能得出一个结论,也应证了这篇文章的引言部分:设计模式来源于经验(生活经验、开发经验)的总结。


总结

看了上面的例子,我们可以对设计模式做一些总结:

  • 设计模式是生活中经验总结。
  • 不使用设计模式也能解决问题,但容易让项目变成“屎山”,难以扩展和维护。使用设计模式能让代码变得“优雅”,易于维护、易于拓展,并且节省时间(生命)。
  • GoF的发布的设计模式一书形成了一种标准。出现了很多的关键字,比如Factory、Adapter,后人使用设计模式都会使用这些关键字来命名。Spring源码就是一个很好地例子,所以想看懂Spring源码,一定要学习设计模式

使用设计模式的准则:

不是为了用而强行使用设计模式,使用的过程应该是很自然的。诶,我需要用到这个模式才能很好的解决问题,所以我要用。

今天就到这里了,祝大家七夕快乐,没有对象的都能今晚脱单。下一篇就是单个设计模式的精讲篇了,我们下期再见~

往期推荐

设计模式 | 4分钟搞懂10种设计模式

蔡大炮准备正式开张啦

家雄又写bug了

家雄别睡了,快起来改bug

原创不易,求个三连鼓励下吧

微信搜索 java-caidapao ,关注大炮~回复“面试题”,领取2020最新面试题

设计模式 | Spring中用到的设计模式,你知道几个?的更多相关文章

  1. Spring中用了哪些设计模式

    1 简单工厂模式 又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一. 简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类. ...

  2. spring中用到哪些设计模式?

    设计模式作为工作学习中的枕边书,却时常处于勤说不用的尴尬境地,也不是我们时常忘记,只是一直没有记忆. Spring作为业界的经典框架,无论是在架构设计方面,还是在代码编写方面,都堪称行内典范.好了,话 ...

  3. 【Spring】Spring中用到的设计模式

    1.简单工厂 又叫静态工厂方法模式,不属于23种设计模式之一. 简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类. Spring中的BeanFactory就是简单工厂模式的 ...

  4. 了解一下Spring中用了哪些设计模式?这样回答面试官才稳

    一:简单工厂模式 又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一. 简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类. ...

  5. Yii2设计模式——Yii2中用到哪些设计模式?

    "Yii2设计模式"包含了两个方面的内容:1.设计模式,2.Yii2框架. <设计模式>一书虽然以JAVA语言来表达设计模式的思想,但是设计模式远不限制于某一种特定的语 ...

  6. Yii2 设计模式——Yii2 中用到哪些设计模式?

    Yii 2 设计模式“包含了两个方面的内容:1. 设计模式,2. Yii 2 框架. <设计模式>一书虽然以JAVA语言来表达设计模式的思想,但是设计模式远不限制于某一种特定的语言,而是在 ...

  7. spring中用到哪些设计模式

    1.工厂模式,这个很明显,在各种BeanFactory以及ApplicationContext创建中都用到了: 2.模版模式,这个也很明显,在各种BeanFactory以及ApplicationCon ...

  8. spring中用到的设计模式

    http://www.cnblogs.com/pengmengnan/p/6717766.html 一 : 工厂模式工厂模式主要是为创建对象提供过度接口,以便将创建对象的具体 过程屏蔽隔离起来,达到提 ...

  9. Spring中用到了哪些设计模式?

    谈谈Spring中都用到了哪些设计模式? JDK 中用到了那些设计模式?Spring 中用到了那些设计模式?这两个问题,在面试中比较常见.我在网上搜索了一下关于 Spring 中设计模式的讲解几乎都是 ...

随机推荐

  1. 线程池的使用ExecutorService

    private ExecutorService executorService = Executors.newFixedThreadPool(5); // 引入线程池来管理多线程 private vo ...

  2. 【转】adobe acrobat pro修改pdf文字

    原文网址:http://zhidao.baidu.com/link?url=7MTeEu5IM49lNIISNQMcZLyLAwMPsRQWF5WAwQPfvkPsbbZLHSQE43MWaIxxVm ...

  3. Day3---------Linux操作系统目录结构

    一.Linux系统文件树状结构 "/" 根目录 "." 当前目录 .. 父目录,既上一层目录 pwd 显示当前目录路径 ls. = ls = ls/ 显示当前目 ...

  4. c&plus;&plus;界面库方案

    最近的开发需要向java以及c++方向转向:看了些java和c++的东西 最近研究了下,最后觉得使用ogre+mygui来实现c++界面,这样用比较方便: 当前ogre,mygui都可以实现界面,可以 ...

  5. &lbrack;Jenkins&rsqb;Jenkins构建时提示java&period;io&period;IOException&colon; No space left on device

    突然发现Jenkins的Job全部都停了,打开Jenkins发现所有的slave机器,均提示: 点开Dead(!),提示Thread has died,如下图: 看图好像说是Jenkins所在的服务器 ...

  6. Intellij IDEA2017&period;3永久激活方法

    随着idea不断地发展,eclipse的缺点日渐明显,为了能够获得良好的编码体验,越来越多的朋友转向了idea,淘汰了eclipse但是由于近期idea所有私人服务器被封杀了,很多喜欢编码的朋友们都陷 ...

  7. cnpm 淘宝镜像设置

    很简单,一句话 npm install -g cnpm --registry=https://registry.npm.taobao.org

  8. 怎么让Word编辑公式又快又好

    现在很多办公学习都是在电脑中进行的.很多文件论文都是在Word中编写定稿以后再打印成册或者去投稿.毫无疑问,在Word中编辑各种各样的文字与符号是一项现在社会中非常必要的技能,而这其中一项就是对公式的 ...

  9. ORACLE常用函数汇总(持续更新中&period;&period;&period;&period;)

    在使用ORACLE过程中,把一些常用的函数的相关用法,注意事项进行简单的汇总,便于自己查询参考. DBMS_RANDOM包 dbms_random是一个可以生成随机数值或者字符串的程序包.这个包有in ...

  10. P4513 小白逛公园

    题目背景 小新经常陪小白去公园玩,也就是所谓的遛狗啦… 题目描述 在小新家附近有一条“公园路”,路的一边从南到北依次排着 nnn 个公园,小白早就看花了眼,自己也不清楚该去哪些公园玩了. 一开始,小白 ...