Spring框架中设计模式之 桥接模式

桥接模式:Spring 中的 JdbcTemplate 类使用了桥接模式,将 JDBC API 与具体的数据库实现分离。

public class JdbcTemplate {
  private DataSource dataSource;

  public JdbcTemplate(DataSource dataSource) {
    this.dataSource = dataSource;
  }

  public <T> List<T> query(String sql, RowMapper<T> rowMapper) {
    // ...
  }
  // ...
}

在上述代码中,JdbcTemplate 类使用了桥接模式,将 JDBC API 与具体的数据库实现分离,可以通过不同的数据源实现类来实现对不同类型的数据库的访问。

在 Spring 中,Bean 对象的创建过程分为两个阶段:注册阶段和实例化阶段。注册阶段是将 Bean 的定义信息注册到容器中,而实例化阶段则是将 Bean 对象真正地实例化。其中,注册阶段使用的是享元模式,将 Bean 的定义信息注册到容器中,而实例化阶段则使用的是工厂方法模式,通过 Bean 工厂创建出 Bean 对象。

享元模式是一种结构型设计模式,它可以在对象的创建过程中共享相同的内部状态,从而减少系统中对象的数量。在 Spring 中,通过使用享元模式,将 Bean 的定义信息注册到容器中,可以减少内存的使用,提高系统的性能。具体来说,在注册阶段,Spring 将 Bean 的定义信息解析成内部数据结构,并将这些信息存储在内部的 Map 中,每个 Bean 对象对应一个 BeanDefinition 对象。当需要获取 Bean 对象时,Spring 根据 Bean 的名称从 Map 中获取 BeanDefinition 对象,然后根据 BeanDefinition 对象中的信息,通过工厂方法创建出 Bean 对象。

在 Spring 的源码中,BeanDefinition 对象表示了 Bean 的定义信息,它包含了 Bean 的名称、类型、作用域、依赖关系等信息。BeanDefinitionRegistry 接口定义了 BeanDefinition 的注册方法,BeanFactory 接口定义了 Bean 的获取方法。在 AbstractBeanFactory 类中,实现了 Bean 对象的实例化逻辑,它使用了工厂方法模式,通过调用 BeanDefinition 对象中的信息,创建出 Bean 对象。而在 DefaultListableBeanFactory 类中,实现了 Bean 对象的注册逻辑,它使用了享元模式,将 BeanDefinition 对象注册到内部的 Map 中,从而减少内存的使用。

综上所述,Spring 中的 Bean 对象的创建过程使用了享元模式和工厂方法模式。享元模式用于将 Bean 的定义信息注册到容器中,从而减少内存的使用,提高系统的性能;工厂方法模式用于创建出 Bean 对象,从而实现了对象的实例化过程。