Spring 用到的设计模式

12 篇文章 0 订阅

Spring用到如下这些设计模式:
工厂模式(简单工厂模式,工厂方法模式),单例模式,适配器模式,代理模式,观察者模式,模板模式

简单工厂模式:

工厂就是处理创建对象的细节,而简单工厂模式就是将创建对象的细节交到了其他类,简单工厂将全部的事情,都在那个类中处理完了,我们只需要从该类中取出对象即可。
符合该模式的就是 Spring中的 BeanFactory接口,我们用的ApplicationContext就是它的实现类。
想想我们是如何使用这个类的:

ApplicationContext context = new ClassPathXmlApplicationContext("/ApplicationContext.xml");
        ServiceA serviceA = context.getBean("ServiceA", ServiceA.class);
        ServiceB serviceB = context.getBean("ServiceB", ServiceB.class);
        First bean = context.getBean(First.class);

如上,我们就是直接将创建对象的操作交给了ClassPathXmlApplicationContext这个类,然后我们直接从中取出对象就完了。这就是简单工厂的实现。

工厂方法模式

FactoryBean这个接口就是典型的工厂方法模式,
工厂方法模式就是定义一个创建对象的接口,由子类去决定要实例化的类是哪一个,将对象的实例化推迟到子类。
FactoryBean定义如下:

public interface FactoryBean<T> {
	T getObject() throws Exception;
	Class<?> getObjectType();
	default boolean isSingleton() {
		return true;
}

getObject()就是它提供给子类的接口。

单例模式

单例模式确保一个类仅有一个实例,提供一个访问它的全局访问点。Spring 创建 Bean 实例默认是单例的。

适配器模式

适配器模式将一个类的接口,转换成客户期望的另一个接口,适配器让原本接口不兼容的类可以合作无间
SpringMVC中的适配器HandlerAdatper
我们常用的都是使用 Controller去处理请求,但是Spring里面不止提供了 Controller来处理请求,还有ServletHttpRequestHandler这几种,当请求过来时,需要先判断是由哪一个处理器处理请求,然后根据它是哪一种接口的实现类调用相应的方法。当增加新的接口,需要修改原来的逻辑,违反了开闭原则(对修改关闭,对扩展开放)。

Spring提供了一个适配器接口,每一种 处理器(Controller接口,Servlet接口,HttpRequestHandler接口)对应一种 HandlerAdapter 实现类,当请求过来,SpringMVC会调用getHandler()获取处理该请求的处理器,然后获取该处理器对应接口的对应的HandlerAdapter,最后调用HandlerAdapterhandle()方法处理请求,实际上调用的是Controller的handleRequest()

或者是Servlet的service()方法,或 HttpRequestHandler的handleRequest()方法

每次添加新的 Controller 时,只需要增加一个适配器类就可以,无需修改原有的逻辑。

代理模式

代理模式就是为另一个对象提供一个替身来控制对这个对象的访问。
spring 的 aop 使用了动态代理将切面逻辑织入到切入点,有两种方式JdkDynamicAopProxy和Cglib2AopProxy。

观察者模式

观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
spring 中 观察者模式常用的地方是 listener 的实现,如ApplicationListener

模板模式

模板方法模式是在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
Spring 中 jdbcTemplate 等,就使用到了模板模式,

public <T> T execute(ConnectionCallback<T> action) throws DataAccessException {
	Connection con = DataSourceUtils.getConnection(obtainDataSource());
	try {
	// Create close-suppressing Connection proxy, also preparing returned Statements.
		Connection conToUse = createConnectionProxy(con);
		return action.doInConnection(conToUse);
	}
	finally {
		DataSourceUtils.releaseConnection(con, getDataSource());
		}
	}

如上, jdbcTemplateexecute() 方法定义了 获取连接–>执行sql语句—>关闭连接这样的逻辑顺序,然后具体操作交给了ConnectionCallback去做。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值