盘点那些Spring中用到的设计模式(上)(附教程)

667 阅读7分钟

前言:

设计模式(Design Pattern)是前辈们对代码开发经验的总结,是在编程实践中逐渐总结出来的套路,它帮助我们使我们的代码更加灵活,高效和便于维护,常用的设计模式一共有23种,而作为我们Spring家族的扛把子Spring,在代码层面上自然也应用到了很多的设计模式,包括几乎每个Spring开发者都熟悉的单例模式。

正好到现在我所编写的设计模式嬉皮笔记系列也已经写了大半,也覆盖了大多数Spring中所用到的设计模式。很多同学,包括我自己在内,学习设计模式最大的障碍是没有遇到实际的应用场景,很多冷门的设计模式很少见到,这就会导致一个什么样的问题呢?就是当我们实际在开发的过程中,很多人了解了设计模式,但是不知道怎么按上去,所以这次呢,我不打算单独把设计模式拿出来讲,而是结合spring中具体的应用实例,来对我之前的笔记做一次小小的总结,每一个设计模式之后都会附上我写的设计模式笔记,需要的朋友可以前去翻阅。

由于Spring中用到的设计模式比较多,我这里总结到的已经多于十个,一次性写完的话一篇文章里面会显得篇幅比较长(其实是分两篇发,这样你就能水一次更新了),我的掘金更新频率相对来说还是比较高的,大概是两三天会更新一篇整理过的笔记出来,所以点赞,投币,收藏,关注,这不是B站的么?

这个,点赞就对了(滑稽),我们下面来看我们本篇文章要说设计模式有哪些

  • 简单工厂
  • 工厂方法
  • 单例模式
  • 装饰者
  • 观察者

废话不多说,走起

1.简单工厂模式:

定义:

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

应用场景:

  • spring IOC实现

工厂模式在实际开发中也算是用到比较多的设计模式了,简单工厂模式就是根据所传入的参数来动态的决定所创建的对象。

等一下,我刚才脑子里灵光一闪,工厂工厂,Factory,难道,BeanFactory ?

没错,BeanFactory就是应用了简单工厂模式,根据传入一个唯一的标识来获得Bean对象。

相关链接:设计模式二连发之简单工厂模式

2. 工厂方法模式

定义:

工厂方法模式是简单工厂的进一步深化, 在工厂方法模式中,我们不再提供一个统一的工厂类来创建所有的对象,而是针对不同的对象提供不同的工厂。也就是说每个对象都有一个与之对应的工厂。

应用场景:

  • 客户端不知道要创建出来的类是什么,但是知道对应的工厂是什么。

  • 客户端可以通过子类来指定创建对应的对象

在Spring中,FactoryBean就是使用了工厂方法模式,既然说明了工厂方法模式为每一类对象都提供了与之对应的对象,那么在Spring 中哪里可以看到这一点呢?

这个大家可以去看一眼它的实现类,下图只展示部分内容:

虽然类的名字各有不同,但是也有继承了FactoryBean这个姓氏。

相关笔记: 从买车到工厂模式(三件套)

3.单例模式

定义:

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

应用场景:

  • 一个全局使用的类频繁地创建与销毁。当某些如打印机程序只需要一个操作实例的时候(多个实例同时调用一台打印机打印文件可能会出现问题)

关于关于Spring的日常开发交流中,我想 Spring下默认的bean均为singleton 这句话算是比较常见的,实际上Spring 并非严格意义上的单例模式,只做到了定义的后半段,即提供一个访问它的全局访问点。

大声喊出来你们的声音,这个访问点是谁? 是BeanFactory

其实大家认真的想一想,Spring是没有办法保证一个类只能有一个实例的,就是从构造器的级别上来控制实例,比如单例模式中的static,但是问题在于spring是没有办法对开发者的代码做到十足的控制的,开发者爱怎么写怎么写,所以Spring非常聪明的地方在于呢,在类的实例化与开发者之间充当了一个中介的角色,BeanFactory 简单点来说就是

我不要你觉得,我要我觉得,我就给你一个实例,听懂了吗?就一个实例

相关链接: 一篇文章讲懂单例模式

4.装饰者设计模式

定义:

装饰模式可以动态的给一个对象增加一些额外的功能(增强功能) 相比于继承,装饰模式能对不支持继承的类进行增强;并且比继承更灵活,不需要生成大量的子类。所以装饰模式也被称作包装器模式。

应用场景:

  • 扩展一个类的功能
  • 动态增加功能,动态撤销
  • Java IO 源码

在我查阅资料的时候,发现几乎谈到Spring装饰者模式应用的文章几乎清一色的都谈到了Spring 在切换多个数据源的时候的应用,大多数文章几乎在这个部分达成了惊人的默契,几乎一模一样,本来我也打算这么说的,但是我没找到具体应用的代码在哪!好气哦。等我后期找到之后待我详细研究一番,看懂了的话就单独整理出来一篇笔记出来。

但是装饰器模式身为一个如此广受重用的设计模式,在Sping中岂能只有切换数据源这一个应用。

比如:Spring中的ClientHttpRequestDecorator,ClientHttpResponseDecorator 都使用了装饰者设计模式。

好厉害,你是怎么找到的呢(自己崇拜自己),因为Decorator是装饰者的意思啊。

相关链接: 从一个手办扯到装饰者模式

5.观察者设计模式

定义:

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

适用范围:

  • 一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。(例:像我前段时间看的一本书《羊的门》,每当村支书做出什么决定时,就通过村子里的那个大喇叭广播给所有村民,让他们去执行。拍卖会上,拍卖师观察下面谁出的价格更高,然后通知现场所有参与拍卖的人)

算了,直接找后缀吧。

尴尬了,没找到(自行脑补捂嘴笑表情包)

哼,你以为这样就能难到了吗,是的

本文完。。。

Spring的事件驱动机制就是应用了观察者模式,ApplicationListener就是作为一个事件监听者的身份。

@FunctionalInterface
public interface ApplicationListener<E extends ApplicationEvent> extends EventListener {
    void onApplicationEvent(E var1);
}

而观察者模式中的广播则是交给ApplicationEventPublisher来实现的

@FunctionalInterface
public interface ApplicationEventPublisher {
    default void publishEvent(ApplicationEvent event) {
        this.publishEvent((Object)event);
    }

    void publishEvent(Object var1);
}

相关链接:设计模式java语言实现之观察者模式

你以为这就完了么?没有,还有下篇呢。

我是韩数,哼,关注我,有你好果子吃(叉腰)。

设计模式系列开源笔记github地址:

设计模式系列笔记