Spring中涉及的设计模式
设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。
设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。项目中合理地运用设计模式可以完美地解决很多问题,每种模式在现实中都有相应的原理来与之对应,每种模式都描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是设计模式能被广泛应用的原因。
Spring中涉及的设计模式主要有:
- 简单工厂模式。
- 工厂方法模式。
- 单例模式。
- 适配器模式。
- 包装类模式。
- 代理模式。
- 观察者模式。
- 策略模式。
- 模板模式。
代理模式(Proxy)
代理模式(Proxy)是为其他对象提供一种代理以控制对这个对象的方法。
- 代理类在运行时创建的代理称之为动态代理。
在Spring中,代理类在AOP的横向切面技术中有使用。
- 在Spring中使用JdkDynamicAopProxy(基于JDK自带的代理模式)和Cglib2AopProxy(CGlib实现的代码)。
简单工厂模式(Simple Factory)
简单工厂模式介绍
简单工程模式又称之为静态工厂方法模式(Static Factory Method),属于创建性模式。
- 在简单工厂模式中,可以根据参数的不同返回不同类的实例。
- 简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同父类。
简单工厂模式包含以下角色:
- Factory:工厂角色。
- 是简单工厂模式的核心,负责实现创建所有具体产品类的实例,工厂类可以被外界直接调用,创建所需的产品对象。
- Product:抽象产品角色。
- 是所有具体产品角色的父类或者接口,负责描述所有实例所共有的公共方法。
- ConcreteProduct:具体产品角色。
- 继承自抽象产品角色,一般为多个,是简单工厂模式的创建模板,工厂返回的都是该角色的某一具体产品。
简单工厂模式的优缺点:
- 优点:只需要传入一个正确的参数,就可以获取所需要的对象而无须知道创建的细节。
- 缺点:工厂类的职责相对过重,增加一个产品需要修改工厂类的判断逻辑,违背开闭原则。
设计模式原则-开闭原则(Open close Principle):一个软件实体,如类,模块和函数应该对扩展开放,对修改关闭。
代码演示
/**
* 抽象产品角色:父类、接口
*/
public abstract class Video {
public abstract void produce();
}
/**
* 具体产品角色
*/
public class JavaVideo extends Video {
@Override
public void produce() {
System.out.println("java");
}
}
/**
* 具体产品类型
* 特点:必须继承父类,重写方法
* 实现接口提供方法
*/
public class CVideo extends Video{
@Override
public void produce() {
System.out.println("C++");
}
}
/**
* 工厂角色
*/
public class VideoFactory {
//注意:工厂方法的返回类型,是video
public Video getVideo(String videoType){
if ("java".equalsIgnoreCase(videoType)){
return new JavaVideo();
} else if ("c".equalsIgnoreCase(videoType)) {
return new CVideo();
}
return null;
}
public Video getVideo(Class clazz){
Video video = null;
try {
video = (Video) clazz.forName(clazz.getName()).newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return video;
}
}
/**
* 测试类
*/
public class TestMain {
public static void main(String[] args) {
VideoFactory factory = new VideoFactory();
Video video = factory.getVideo("java");
//JavaVideo的具体产品实现类
video.produce();
}
}
Spring中的使用案例
Spring中BeanFactory就是简单工厂模式的体现,根据传入一个唯一的表示来获取Bean对象。
- 配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<!--根标签-->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation