常见设计模式解析汇总

1.工厂模式

在 Spring 中我们一般是将 Bean 的实例化直接交给容器去管理的, 实现了使用和创建的分离, 这时容器直接管理对象, 还有种情况是, bean 的创建过程我们交给一个工厂去实现, 而 Spring 容器管理这个工厂。 Spring 使用工厂模式可以通过 BeanFactory 或 ApplicationContext 创建 bean 对象。 两者对比如下:
 BeanFactory: 延迟注入(使用到某个 bean 的时候才会注入) , 相比于ApplicationContext 来说会占用更少的内存, 程序启动速度更快。
 ApplicationContext: 容器启动的时候, 不管 bean 是否用到, 一次性创建所有的 bean。 BeanFactory 仅提供了最基本的依赖注入支持,ApplicationContext 扩展了 BeanFactory ,除了有 BeanFactory 的功能还有额外更多功能, 所以一般开发人员使用 ApplicationContext 会更多。具体参考如下:工厂模式详解

2.单例设计模式

在系统中, 有一些对象其实我们只需要一个, 比如说: 线程池、 缓存、 对话框、注册表、 日志对象等。 事实上, 这一类对象只能有一个实例, 如果制造出多个实例就可能导致一些问题的产生, 比如: 程序的行为异常、 资源使用量、 或者不一致性的结果。
使用单例模式的好处:
 对于频繁使用的对象, 可以省略创建对象所花费的时间, 这对于那些重量级对象而言, 是非常可观的一笔系统开销。
 由于 new 操作的次数减少, 因而对系统内存的使用频率也会降低, 这将减轻 GC 压力, 缩短 GC 停顿时间。Spring 中 bean 默认作用域是 singleton(单例) , 除了 singleton 作用域外,Spring 中 bean 还有下面几种作用域。
 prototype: 每次请求都会创建一个新的实例。
 request: 每一次 HTTP 请求都会产生一个新的 bean, 该 bean 仅在当前HTTP request 内有效。
 session: 每一次 HTTP 请求都会产生一个新的 bean, 该 bean 仅在当前HTTP session 内有效。
这里关注一下几种实现方式:包含登记式单例模式

单例模式

3.代理模式

AOP(Aspect-Oriented Programming:面向切面编程)能够将那些与业务无关, 却为业务模块所共同调用的逻辑或责任(例如事务处理、 日志管理、 权限控制等)封装起来, 便于减少系统的重复代码, 降低模块间的耦合度, 并有利于未来的可拓展性和可维护性。Spring AOP 就是基于动态代理的, 其中有两种不同的代理方法: JDK 代理和Cglib 代理。 具体可以看之前文章。当然, 也可以使用 AspectJ, Spring AOP 已经集成了 AspectJ。 使用 AOP 之后我们可以把一些通用功能抽象出来, 在需要用到的地方直接使用即可, 这样大大简化了代码量。 我们需要增加新功能时也方便, 这样也提高了系统扩展性。日志功能、 事务管理等等场景都用到了 AOP 。
另外, Spring AOP 属于运行时增强, 而 Aspect J 是编译时增强。Spring AOP基于代理来实现, 而 Aspect J 是基于字节码操作。

4.模板方法

模板方法是一种行为设计模式, 它定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。 模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤的实现方式。 Spring 中 jdbcTemplate、hibernateTemplate 等以 Template 结尾的对数据库操作的类, 它们就使用到了模板模式。 一般情况下, 我们都是使用继承的方式来实现模板模式, 但是Spring 并没有使用这种方式, 而是使用 Callback 模式与模板方法模式配合, 既达到了代码复用的效果, 同时增加了灵活性。
模板模式代码解析

5.观察者模式

观察者模式是一种对象行为型模式。 它表示的是一种对象与对象之间具有依赖关系, 当一个对象发生改变的时候, 这个对象所依赖的对象也会做出反应。Spring 事件驱动模型就是观察者模式很经典的一个应用。 Spring 事件驱动模型非常有用, 在很多场景都可以解耦我们的代码。 比如我们每次添加商品的时候都需要重新更新商品索引, 这个时候就可以利用观察者模式来解决这个问题。Spring 中 Observer 模式常用的地方是 listener 的实现。 如:ApplicationListener。
观察者模式代码解析

6.适配器模式

适配器模式(Adapter Pattern) 将一个接口转换成客户希望的另一个接口, 适配器模式使接口不兼容的那些类可以一起工作, 其别名为包装器(Wrapper)。我们知道 Spring AOP 的实现是基于代理模式, 但是 Spring AOP 的增强或通知(Advice)使用到了适配器模式, 与之相关的接口是 AdvisorAdapter 。 Advice 常用的类型有: BeforeAdvice(目标方法调用前,前置通知) 、 AfterAdvice(目标
方法调用后,后置通知) 、 AfterReturningAdvice(目标方法执行结束后, return之前)等等。 每个类型 Advice(通知) 都有对应的拦截
器:MethodBeforeAdviceInterceptor、 AfterReturningAdviceAdapter、
AfterReturningAdviceInterceptor。 Spring 预定义的通知要通过对应的适配器,适配成 MethodInterceptor 接口(方法拦截器)类型的对象(如:MethodBeforeAdviceInterceptor 负责适配MethodBeforeAdvice) 。在 Spring MVC 中, DispatcherServlet 根据请求信息调用 HandlerMapping, 解
析请求对应的 Handler。 解析到对应的 Handler(也就是我们平常说的Controller 控制器) 后, 开始由 HandlerAdapter 适配器处理。 HandlerAdapter作为期望接口, 具体的适配器实现类用于对目标类进行适配, Controller 作为需要适配的类。为什么要在 Spring MVC 中使用适配器模式? Spring MVC 中的 Controller 种类众多, 不同类型的 Controller 通过不同的方法来对请求进行处理。 如果不利用
适配器模式的话, DispatcherServlet 直接获取对应类型的Controller, 需要的自行来判断, 像下面这段代码一样:
if(mappedHandler.getHandler() instanceof MultiActionController){
((MultiActionController)mappedHandler.getHandler()).xxx
}else if(mappedHandler.getHandler() instanceof XXX){

}else if(…){

}
假如我们再增加一个 Controller 类型就要在上面代码中再加入一行 判断语句,这种形式就使得程序难以维护, 也违反了设计模式中的开闭原则 – 对扩展开放,对修改关闭。
适配器模式代码解析

7.策略模式

策略模式对应于解决某一个问题的一个算法族, 允许用户从该算法族中任选一个算法解决某一问题, 同时可以方便的更换算法或者增加新的算法。 并且由客户端决定调用哪个算法, spring 中在实例化对象的时候用到 Strategy 模式。

策略模式代码分析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值