Spring中的9种设计模式汇总

Java大拿 2019-01-03 18:22:50 ⋅ 2310 阅读

1. 简单工厂

又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一。

简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类。

Spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得Bean对象,但是否是在传入参数后创建还是传入参数前创建这个要根据具体情况来定。

 

 

2. 工厂方法(Factory Method)

定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。

Spring中的FactoryBean就是典型的工厂方法模式。如下图:

 

3. 单例(Singleton)

保证一个类仅有一个实例,并提供一个访问它的全局访问点。

Spring中的单例模式完成了后半句话,即提供了全局的访问点BeanFactory。但没有从构造器级别去控制单例,这是因为Spring管理的是是任意的Java对象。

 

4. 适配器(Adapter)

将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

Spring中在对于AOP的处理中有Adapter模式的例子,见如下图:

由于Advisor链需要的是MethodInterceptor(拦截器)对象,所以每一个Advisor中的Advice都要适配成对应的MethodInterceptor对象。

 

 

5.包装器(Decorator)

动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。

Spring中用到的包装器模式在类名上有两种表现:一种是类名中含有Wrapper,另一种是类名中含有Decorator。基本上都是动态地给一个对象添加一些额外的职责。

 

 

6. 代理(Proxy)

为其他对象提供一种代理以控制对这个对象的访问。

从结构上来看和Decorator模式类似,但Proxy是控制,更像是一种对功能的限制,而Decorator是增加职责。

Spring的Proxy模式在aop中有体现,比如JdkDynamicAopProxy和Cglib2AopProxy。

 

 

7.观察者(Observer)

定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

Spring中Observer模式常用的地方是listener的实现。如ApplicationListener。

 

 

 

8. 策略(Strategy)

定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。

Spring中在实例化对象的时候用到Strategy模式,见如下图:

在SimpleInstantiationStrategy中有如下代码说明了策略模式的使用情况:

 

 

 

9.模板方法(Template Method)

定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

Template Method模式一般是需要继承的。这里想要探讨另一种对Template Method的理解。Spring中的JdbcTemplate,在用这个类时并不想去继承这个类,因为这个类的方法太多,但是我们还是想用到JdbcTemplate已有的稳定的、公用的数据库连接,那么我们怎么办呢?我们可以把变化的东西抽出来作为一个参数传入JdbcTemplate的方法中。但是变化的东西是一段代码,而且这段代码会用到JdbcTemplate中的变量。怎么办?那我们就用回调对象吧。在这个回调对象中定义一个操纵JdbcTemplate中变量的方法,我们去实现这个方法,就把变化的东西集中到这里了。然后我们再传入这个回调对象到JdbcTemplate,从而完成了调用。这可能是Template Method不需要继承的另一种实现方式吧。

以下是一个具体的例子:

JdbcTemplate中的execute方法:

JdbcTemplate执行execute方法:


全部评论: 0

    我有话说:

    「轻阅读」聊一聊6常用架构设计模式(上)

      许多现代应用都需要在企业级规模上进行构建,有时甚至需要在互联网规模上进行构建。这些应用都需要满足可扩展性、可用性、安全性、可靠性和弹性需求。 在本文,我将谈论一些设计模式,这些模式

    「转载」使用DDD指导业务设计一点思考

    领域驱动设计(DDD) 是 Eric Evans 提出软件设计方法和思想,主要解决业务系统设计和建模。DDD 有大量难以理解概念,尤其是翻译原因,某些词汇非常生涩,例如:模型、限界上下文

    Eclipse OpenJ9 v0.23.0 发布,Java 虚拟机

    Eclipse OpenJ9 v0.23.0 已发布,Eclipse OpenJ9 是 OpenJDK JVM,此 Java 虚拟机经过优化,具备占用空间小、启动速度快以及吞吐量高等优势。 新

    构建数据集成和实时数据处理流水线工具Spring Cloud Data Flow

    Spring Cloud Data Flow 是基于原生云对 Spring XD 重新设计

    微服务架构下若干常用设计模式

    在我们选择了用微服务架构来设计、交付数字化应用后,因微服务架构本身所带来一些共性问题。

    DDDplus 1.0.2 发布,轻量级业务台开发框架

    DDDplus 简介 一套轻量级业务台开发框架,以DDD思想为本,致力于业务资产可沉淀可传承,全方位解决复杂业务场景扩展问题,实现台核心要素,赋能台建设。 融合了前台复杂生态协作方法论

    【总结】前端5大常见设计模式,代码一看你就懂!

    用代码示例来掌握前端5大设计模式

    IntelliJ 平台 2020 年路线图,项目模型将重新设计

    协同编辑、支持云执行、重新设计项目模型

    码云推荐:一个优秀分布式spring boot/Spring Cloud API限流框架,特别适合微服务架构

    一个优秀分布式spring boot/Spring Cloud API限流框架,特别适合微服务架构.

    电商实战篇:商品模型分析与设计(超级实用)

    最近在设计电商平台,那么在整个电商系统商品模型是非常重要模块,也可以说是整个电商核心,那么接下来我们一起分析一下,设计出一个完整商品模型

    微服务架构学习笔记:gRPC Spring Boot Starter 2.2.0 发布,及使用步骤

    gRPC Spring Boot Starter 项目是一个 gRPC Spring Boot 模块。内嵌一个 gRPC Server 对外提供服务,并支持 Spring Cloud 服务发现

    架构实战篇(四):Spring Boot整合 Thymeleaf

    Thymeleaf 是一模板语言。那模板语言或模板引擎是什么?

    Spring 5 WebFlux 响应式开发示例

    Spring 5 已经大力支持了响应式开发模式,引入响应式框架叫做 Spring WebFlux。

    【SpringCloud实战】一次开发使用Feign添加动态Header问题思考

    踩了一个Spring Cloud Feign添加自定义Header坑,分享给大家

    全网最详细一篇SpringCloud总结

    什么是Spring cloud 构建分布式系统不需要复杂和容易出错。Spring Cloud 为最常见分布式系统模式提供了一简单且易于接受编程模型,帮助开发人员构建有弹性、可靠、协调

    Spring Tools 4.9.0 发布

    Spring Tools 4 是由 Spring 团队打造下一代 Spring 开发工具,基本上是从零开始构建,融合了现代技术和开发者工具架构。它在单独进程运行,从构建之初就考虑到了

    架构实战篇(六):Spring Boot RestTemplate使用

    RestTemplate是Spring提供用于访问Rest服务客户端,RestTemplate提供了多种便捷访问远程Http服务方法,能够大大提高客户端编写效率。

    Spring Boot 2.4.3、2.3.9 版本发布

    Spring Boot 2.4.3 、2.3.9 已经发布。现在可从 repo.spring.io 和 Maven Central 获得。 <parent>   

    Spring Cloud Alibaba 发布毕业后首个版本

    方剑,花名洛夜,GitHub ID @fangjian0423,开源爱好者,阿里巴巴高级开发工程师,阿里云产品 EDAS 开发,Spring Cloud Alibaba 开源项目负责人。