设计模式是一种思想,是一种更快更好更优雅地解决问题的一种思想。这种思想在很多优秀的框架中都有落地。比如Spring框架。 接下来,我将从我的角度出发,粗浅的想一下,Spring框架中常用的一些设计模式。 Spring框架核心解决的问题是什么呢?个人理解是为了解决对象之间复杂的依赖关系,降低耦合。或者可以这么说,做项目我们也可以什么框架都不用,实现功能的时候,创建多个类,自己去维护类什么时候创建、使用、销毁等生命周期以及类之间的关系。自己维护的很好或者功能很简单的话,也可以不使用框架。框架本身也就是一个黑盒工具而已,开源使我们可以将其白盒化。 既然Spring框架的核心内容假设是解决对象之间复杂的依赖关系。通俗来说便是要啥给啥。为了实现这个目的,Spring核心的IOC容器出现了,对象都放在这个容器里,需要的时候从里面取。那就涉及到几点: 1。创建对象,保存对象,保存对象之间的关联关系 2。获取对象1。创建对象 涉及到如何创建,是只创建一次还是创建多次,有关联关系,先创建A还是先创建B等。单例模式、原型模式、工厂模式、策略模式可以来帮忙。 工厂模式: Spring中的BeanFactory、FactoryBean 单例模式: 保证一个类仅有一个实例,并提供一个全局访问点。Spring下默认创建的Bean都是单例对象。 常用的单例模式写法又有很多:最简单的就是懒汉式了,还有饿汉式、注册式、序列化方式、枚举方式等。 原型模式: Java中的克隆对象。以某个对象为原型,复制出一个新的对象。两个对象内容相同,但是对象实例不同。 用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用。 策略模式: 一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的context对象。策略对象改变context对象的执行算法。 定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。2。使用对象 获取对象的时候,有策略方法,也可以通过代理进行功能增强等。策略模式、代理模式、模板方法模式、适配器模式、装饰器模式等 代理模式: 为其他对象提供一种代理以控制对这个对象的访问。从结构上来看和装饰器模式类似,但Proxy是控制,更像是一种对功能的限制,而装饰器是增加职责。 Spring的AOP代理,应该是很出名的。JdkDynamicAopProxy、Cglib2AopProxy。 模板模式: 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。比如JdbcTemplate 适配器模式: 将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 SpringAOP模块对BeforeAdvice、AfterAdvice、ThrowsAdvice三种通知类型的支持实际上是借助适配器模式来实现的,这样的好处是使得框架允许用户向框架中加入自己想要支持的任何一种通知类型,上述三种通知类型是SpringAOP模块定义的,它们是AOP联盟定义的Advice的子类型。 属于结构型模式,适配类与被适配类之间没有必然联系。满足hasa关系。 装饰器模式: 属于结构型模式。满足isa关系。 Spring中用到的包装器模式在类名上有两种表现:一种是类名中含有Wrapper,另一种是类名中含有Decorator。基本上都是动态地给一个对象添加一些额外的职责。 观察者模式: 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 当对象间存在一对多关系时,则使用观察者模式(ObserverPattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。 Spring中Observer模式常用的地方是Listener的实现。如ApplicationListener。