设计模式(design pattern)是对面向对象设计中反复出现的问题的解决方案。这个术语是在1990年代由Erich Gamma等人从建筑设计领域引入到计算机科学中来的。这个术语的含义还存有争议。算法不是设计模式,因为算法致力于解决问题而非设计问题。设计模式通常描述了一组相互紧密作用的类与对象。设计模式提供一种讨论软件设计的公共语言,使得熟练设计者的设计经验可以被初学者和其他设计者掌握。设计模式还为软件重构提供了目标。
目前出版了许多关于设计模式的书籍,我最喜欢的一本就是《大话设计模式》,
该书形象生动的阐述了设计模式,今天我们以Spring为例探讨一下设计模式在Spring框架中的应用,Spring作为业界的经典框架,无论是在架构设计方面,还是在代码编写方面,都堪称业界标杆,而Spring中常用的设计模式达到九种,我们一起来看一下
1.简单工厂
简单工厂又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种设计模式之一,简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个类
Spring中的BeanFactory就是简单工厂模式的体现。
2.工厂方法
通常由应用程序直接使用new创建新对象,为了将创建对象和使用解耦,采用工厂模式将对象的创建和初始化交给工厂对象。
一般情况下,应用程序有自己的工厂对象来创建bean,如果将应用程序自己的工厂对象交给Spring管理,那么Spring管理的就不是普通bean而是工厂bean,例如Spring中的FactoryBean就是典型的工厂方法模式
3.单例模式
单例模式就是保证一个类仅有一个示例,并提供一个访问它的全局访问点。
Spring中提供了BeanFactory,其给我们创建的对象默认是单例的,但是可以通过scope属性来指定是单例还是多例,如果是singleton则为单例,prototype则为多例。
4.适配器(Adapter)
适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。
这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。举个真实的例子,读卡器是作为内存卡和笔记本之间的适配器。您将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。
Spring中将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
5.包装器(Decorator)
装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。
这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。
Spring 中用到的装饰器模式在类名上有两种表现:一种是类名中含有 Wrapper,另一种是类名中含有Decorator
6.代理模式
在Spring的AOP中,使用Advice(通知)来增强被代理类的功能,Spring实现这一AOP功能就用到了代理模式,底层实现有2种方式,一种是基于JDK动态代理,一种是基于CGLib字节码生成技术代理,SpringAOP对类进行方法级别的切面增强,在生成被代理类的代理类方法前设置拦截器,通过执行拦截器中的内容增强代理方法功能,实现面向切面编程
SpringAOP一般用于记录日志,权限控制,缓存优化,事务管理
7.观察者模式(Observer)
定义对象间的一种一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新
Spring中Observer模式常用的地方是listener的实现,例如ApplicationListener。
8.策略模式(Strategy)
定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。
Spring中在实例化对象的时候用到Strategy模式
9.模板方法(Template Method)
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
Spring中的JdbcTemplate就用到了模板方法。