Spring中的设计模式(11种)
admin
2024-03-27 03:05:35
0

文章目录

  • 1 单例模式
    • 1.1 Spring中的Singleton Bean是否是单例模式?
  • 2 构建者模式
  • 3 工厂方法模式
  • 4 适配器模式
  • 5 组合模式
  • 6 装饰器模式
  • 7 代理模式
  • 8 责任链模式
  • 9 观察者模式
  • 10 策略模式
  • 11 模板方法模式

1 单例模式

1.1 Spring中的Singleton Bean是否是单例模式?

区分 singleton pattern 与 Spring 中的 singleton bean

  • 根据单例模式的目的 Ensure a class only has one instance, and provide a global point of access to it
  • 显然 Spring 中的 singleton bean 并非实现了单例模式,singleton bean 只能保证每个容器内,相同 id 的 bean 单实例
  • 当然 Spring 中也用到了单例模式,例如
    • org.springframework.transaction.TransactionDefinition#withDefaults
    • org.springframework.aop.TruePointcut#INSTANCE
    • org.springframework.aop.interceptor.ExposeInvocationInterceptor#ADVISOR
    • org.springframework.core.annotation.AnnotationAwareOrderComparator#INSTANCE
    • org.springframework.core.OrderComparator#INSTANCE

2 构建者模式

定义 Separate the construction of a complex object from its representation so that the same construction process can create different representations

它的主要亮点有三处:

  1. 较为灵活的构建产品对象(RabbitMQ中构建交换机等都是构建者模式)

  2. 在不执行最后 build 方法前,产品对象都不可用

  3. 构建过程采用链式调用,看起来比较爽

Spring 中体现 Builder 模式的地方:

  • org.springframework.beans.factory.support.BeanDefinitionBuilder

  • org.springframework.web.util.UriComponentsBuilder

  • org.springframework.http.ResponseEntity.HeadersBuilder

  • org.springframework.http.ResponseEntity.BodyBuilder

3 工厂方法模式

定义 Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory Method lets a class defer instantiation to subclasses

根据上面的定义,Spring 中的 ApplicationContext 与 BeanFactory 中的 getBean 都可以视为工厂方法,它隐藏了 bean (产品)的创建过程和具体实现

Spring 中其它工厂:

  • org.springframework.beans.factory.FactoryBean(bean实例化的一种方式)

  • @Bean 标注的静态方法及实例方法

  • ObjectFactory 及 ObjectProvider

前两种工厂主要封装第三方的 bean 的创建过程,后两种工厂可以推迟 bean 创建,解决循环依赖及单例注入多例等问题

4 适配器模式

定义 Convert the interface of a class into another interface clients expect. Adapter lets classes work together that couldn’t otherwise because of incompatible interfaces

典型的实现有两处:

  • org.springframework.web.servlet.HandlerAdapter – 因为控制器实现有各种各样,比如有
    • 大家熟悉的 @RequestMapping 标注的控制器实现
    • 传统的基于 Controller 接口(不是 @Controller注解啊)的实现
    • 较新的基于 RouterFunction 接口的实现
    • 它们的处理方法都不一样,为了统一调用,必须适配为 HandlerAdapter 接口
  • org.springframework.beans.factory.support.DisposableBeanAdapter – 因为销毁方法多种多样,因此都要适配为 DisposableBean 来统一调用销毁方法

5 组合模式

定义 Compose objects into tree structures to represent part-whole hierarchies. Composite lets clients treat individual objects and compositions of objects uniformly

典型实现有:

  • org.springframework.web.method.support.HandlerMethodArgumentResolverComposite
  • org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite
  • org.springframework.web.servlet.handler.HandlerExceptionResolverComposite
  • org.springframework.web.servlet.view.ViewResolverComposite

composite 对象的作用是,将分散的调用集中起来,统一调用入口,它的特征是,与具体干活的实现实现同一个接口,当调用 composite 对象的接口方法时,其实是委托具体干活的实现来完成

6 装饰器模式

定义 :动态的为一个类增加新的功能,装饰模式是一种用于代替继承技术的模式无需通过继承增加子类就能够灵活的扩展新功能

典型实现:

  • org.springframework.web.util.ContentCachingRequestWrapper

7 代理模式

定义:对另外一个对象提供代理或者占位,用来控制对这个对象的访问

装饰器模式注重的是功能增强,避免子类继承方式进行功能扩展,而代理模式更注重控制目标的访问

典型实现:

  • org.springframework.aop.framework.JdkDynamicAopProxy
  • org.springframework.aop.framework.ObjenesisCglibAopProxy

8 责任链模式

定义:可以有多个请求的处理对象,串成一个链;每个对象都有机会处理这个请求处理,请求就会沿着处理链依次向后传递,直到遇到能够处理该请求的对象

典型实现:

  • org.springframework.web.servlet.HandlerInterceptor

9 观察者模式

定义:定义对象之间的一对多依赖关系,以便在一个对象更改状态时,自动通知并更新其所有依赖关系

典型实现:

  • org.springframework.context.ApplicationListener
  • org.springframework.context.event.ApplicationEventMulticaster
  • org.springframework.context.ApplicationEvent

10 策略模式

定义:定义一系列算法,封装每个算法,并使它们可互换。策略允许算法独立于使用它的客户端而变化

典型实现:

  • org.springframework.beans.factory.support.InstantiationStrategy
  • org.springframework.core.annotation.MergedAnnotations.SearchStrategy
  • org.springframework.boot.autoconfigure.condition.SearchStrategy

11 模板方法模式

定义:在操作中定义算法的框架,将一些步骤推迟到子类。模板方法允许子类在不改变算法结构的情况下重新定义算法的某些步骤

典型实现:

  • 大部分以 Template 命名的类,如 JdbcTemplate,TransactionTemplate
  • 很多以 Abstract 命名的类,如 AbstractApplicationContext

相关内容

热门资讯

云南元阳阿者科村第十二次分红 ... 夏日蝉鸣中,云南省元阳县阿者科村的梯田如层层绿绸环绕村落,生机盎然。7月8日,这个坐落于红河州的哈尼...
张家界康养之旅,张家界五天四晚... 人到中年,总觉得身体越来越差,想找个地方好好放松一下,张家界成了我的首选。这里空气清新,负氧离子含量...
沿着纬度听中国︱四川德阳:“川... 央广网成都7月9日消息(记者 昌思荣 见习记者 唐诗敏)当神秘的北纬30°线如一条隐秘的脉络横穿四川...
西北旅游必备攻略!西北七天六晚... 第一天:兰州集结 - 黄河风情初体验 清晨抵达兰州中川国际机场,扑面而来的是西北特有的干燥空气与灿烂...
绿光森林全集哪有的看? 绿光森林全集哪有的看?现在好像湖南台有,之前就是星空,不然买碟也OK
《文艺心理学》课程讲什么内容? 《文艺心理学》课程讲什么内容?《文艺心理学》是一门运用心理学和文艺学的跨学科方法来研究古今中外的文艺...
老舍先生的文章有那些? 老舍先生的文章有那些?长篇小说《骆驼祥子》、《赵子日》、《老张的哲学》、《四世同堂》、《二马》、《小...
女主角冷酷无情的小说 女主角冷酷无情的小说一直冷酷最好你没问题吧,一般情况下都是男主角冷酷无情的说。献给爱米丽的一朵花
皇子归来之欢喜知府和皇子归来之... 皇子归来之欢喜知府和皇子归来之欢喜县令是一部戏吗我个人觉得是,只是属于不同的章节
古人为何远比现代人重视后世史书... 古人为何远比现代人重视后世史书对自己的评价?其实现代人也比较重视史书,因为人更爱追求长生之道,如果不...
我放学后做作业英文怎么写? 我放学后做作业英文怎么写?I do homework after shool.I do my ho...
请是学者的看过来,帮看看我还有... 请是学者的看过来,帮看看我还有可能成为一名学者吗虽然我不是学者,我还是想说:既然已经做了,也坚持了,...
这是犬夜叉里的第几集? 这是犬夜叉里的第几集?是犬夜叉第65集:再见了,青春的每一天。冥加爷爷的未婚妻日向奶奶跳到犬夜叉身上...
谁能帮我把这个网页中的文字提取... 谁能帮我把这个网页中的文字提取出来啊,感激不尽!你在浏览器上 点击 查看--源文件 就可以看到了
怎么做小学生剪贴报 怎么做小学生剪贴报 急要,求求各位 网上下点图片小学生嘛排版好看点就行了材料可以叫大人删改一下
博学审问慎,思明辩笃行的意思是... 博学审问慎,思明辩笃行的意思是?想问博学审问慎,思明辩笃行的意思博学虽未能审问慎思明辩笃行期与诸君共...
小孩没娘是什么 小孩没娘是什么如果有人跟你说:“这孩子没娘” 你就会问:“为什么呢?” 接着他就会说:“因为他娘死的...
极品飞车9和10的故事 极品飞车9和10的故事请帮我详细介绍一下。不过它们到底有什么瓜葛?... 请帮我详细介绍一下。不过...
多媒体技术应用领域的介绍 多媒体技术应用领域的介绍 多媒体技术应用领域集文字、声音、图像、视频、通信等多项技术于一体,采用计算...
影视剧里有哪些巧妙的广告植入? 影视剧里有哪些巧妙的广告植入?现在不就网剧喜欢植入广告,不过还挺好看。