这是我参与「第五届青训营 」伴学笔记创作活动的第 14 天
设计模式
什么是设计模式?
设计模式(Design pattern)是一种代码设计方法,它是对软件工程中常见问题的普遍解决方案的抽象。它们可以用于解决不同的设计问题,从而帮助软件开发人员设计出高效、可扩展和易于维护的代码。设计模式并不是完整的解决方案,而是一种思想,可以帮助开发人员解决特定的问题。因此,使用设计模式需要根据具体情况进行适当的改进和调整。
当然以上的概念比较晦涩难懂,那我们就拿一些具体的例子来说明设计模式给我们带来的好处吧,本文就以市面上最流行的Spring框架中使用到的部分设计模式来简述设计模式
控制反转IOC
-
控制反转IOC: Inversion of Control
- 是一种解耦设计原则
- 主要目的是借助第三方,比如Spring IOC容器实现具有依赖关系的对象之间的解耦,从而降低代码之间的耦合度
-
Spring IOC容器
Spring IOC:容器负责创建对象并将对象统一放在一起,管理配置这些对象的属性和行为.从创建中处理这些对象的整个生命周期,直到对象被完全销毁,Spring IOC容器类似一个工厂,在创建对象时,只需要配置好配置文件或者是注解即可,不需要关注对象是如何创建的。在使用时,可以手动从容器中获取相应的对象,也可以使用注解自动注入。 -
控制反转示例:
- 对象a依赖于对象b, 当对象a需要使用对象b时必须由对象a创建对象b的实例
- 引入IOC容器后,当对象a需要使用对象b时,可以指定IOC容器去创建一个对象b注入到对象a中
- 引入IOC容器之后,对象a获取对象b的过程,由主动行为变为被动行为
- 好处:在此过程中我们无需担心对象a没有注入对象b导致的空指针问题。
依赖注入DI:Dependency Inject
- 将实例变量传入到一个对象中去
- 是实现控制反转的一种设计模式
工厂设计模式Factory
- Spring框架中BeanFactory和ApplicationContext类使用工厂模式创建Bean对象
BeanFactory(懒加载工厂 条件加载工厂)
- 延迟注入,即使用到某个Bean时才会进行注入
- 和ApplicationContext相比会占用更少的内存,程序启动速度更快
ApplicationContext(饿汉式加载工厂)
-
容器启动时就创建所有的Bean
-
和BeanFactory相比 ,BeanFactory仅提供了最基本的依赖注入支持 . ApplicationContext扩展了BeanFactory, 除了BeanFactory的功能外还包含其余更多的功能,通常使用ApplicationContext创建Bean
-
ApplicationContext的三个实现类:
- ClassPathXmlApplication: 将上下文文件作为类路径资源
- FileSystemXmlApplication: 从文件系统中的XML文件中载入上下文定义信息
- XmlWebApplicationContext: 从Web系统中的XML文件中载入上下文定义信息
单例设计模式Singleton
Spring中的Bean的作用域默认就是单例Singleton的 . Spring中的Bean还可以定义以下作用域:
- prototype: 每次请求都会创建一个新的Bean实例
- request: 每一次HTTP请求都会创建一个新的Bean实例,该Bean实例仅在当前HTTP request中有效
- session: 每一次HTTP请求都会创建一个新的Bean实例,该Bean实例仅在当前HTTP session中有效
代理设计模式Proxy
AOP中的代理模式
面向切面编程AOP: Aspect-Oriented Programming
-
面向切面编程能够将和具体业务无关,但是大多数业务模块中所共同调用的逻辑或者业务功能结合起来起作用 比如事务管理,日志管理,权限控制等
-
有利于减少重复代码,降低模块之间的耦合度,并有利于面向未来的可拓展性和可维护性
- 使用AOP可以将一些通用功能抽象出来,在需要使用的地方直接使用,这样可以大大简化代码量
- 需要增加新功能也会更加简单方便,这样可以提高系统的扩展性
-
Spring AOP基于动态代理实现的:
-
代理对象实现了接口:
- Spring AOP会使用Java动态代理JDK Proxy创建代理对象 完成对象的代理操作
-
代理对象没有实现接口:
- Spring AOP会使用Cglib Proxy生成一个被代理对象的子类作为代理类完成对象的代理操作
-
- Spring AOP集成了
AspectJ,AspectJ是Java中最为完整的AOP框架
总结
- IOC(Inversion of Control)是一种解耦设计原则,它的目的是借助第三方容器实现具有依赖关系之间的解耦,解除了具有依赖关系的对象之间的强绑定关系。
- 依赖注入(Depedency Inject)是指将一个具体的实例对象传递给引用对象
- Factory设计模式:将对象的实例化过程与使用过程进行解耦
- BeanFatory工厂:懒汉式加载工厂,在使用到某个Bean时才会进行注入对象
- ApplicaitonFactory工厂:饿汉式加载工厂,在容器启动时就创建所有工厂
- Singleton:在容器中只需要一个实例对象就可以完成工作就可以采用单例模式,比如说大多数框架中的全局上下文对象。当然单例模式也有饿汉式和懒汉式加载方式。
- Proxy代理模式
- 面向切面编程(Aspect-Oriented Programming)
- 面向切面编程能够将具体业务和通用业务结合起来工作,比如事务管理,日志管理,权限控制
- 基于面向切面编程的思想我们可以将一些通用的功能抽象,可以复用代码,同时降低了模块之间的耦合度,当然也有利于软件未来的拓展和维护,因为通用业务和具体业务是通过代理对象建立了一层调用屏障的,所以通用业务和具体业务的升级互不影响。
- 面向切面编程(Aspect-Oriented Programming)