编程中的智慧五:工厂设计模式

工厂模式

工厂模式是一种创建型设计模式,它通过定义一个创建对象的接口,让子类决定实例化哪个类。工厂模式使得一个类的实例化延迟到其子类。Spring框架广泛应用了工厂模式来管理Bean的创建过程,具体应用包括简单工厂模式、工厂方法模式和抽象工厂模式。下面,我们将详细展开这些模式在Spring中的应用,并通过源码分析加以说明。

1. 简单工厂模式

简单工厂模式通过一个工厂类根据传入的参数决定实例化哪个具体类。Spring中的BeanFactory接口和其实现类如DefaultListableBeanFactory使用了简单工厂模式。

1.1 简单工厂模式概述

简单工厂模式包含以下角色:

  • 工厂类:负责创建具体对象。
  • 抽象产品类:定义产品的共同接口。
  • 具体产品类:实现抽象产品类的具体对象。

在Spring中,BeanFactory是一个核心接口,提供了获取Bean实例的方法。DefaultListableBeanFactory是其一个常用的实现类,负责管理和创建Bean实例。

1.2 简单工厂模式在Spring中的实现

源码分析:

DefaultListableBeanFactory中,通过getBean方法获取Bean实例:

public Object getBean(String name) throws BeansException {
    return doGetBean(name, null, null, false);
}

protected <T> T doGetBean(final String name, final Class<T> requiredType, final Object[] args, boolean typeCheckOnly) throws BeansException {
    // 根据Bean名称获取Bean实例
    Object sharedInstance = getSingleton(beanName);
    if (sharedInstance != null) {
        return (T) getObjectForBeanInstance(sharedInstance, name, beanName, null);
    }

    // 获取Bean定义
    final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
    // 创建Bean实例
    Object bean = createBean(beanName, mbd, args);
    
    return (T) getObjectForBeanInstance(bean, name, beanName, mbd);
}

createBean方法中,根据Bean的定义创建具体实例,这正是简单工厂模式的体现。

2. 工厂方法模式

工厂方法模式定义了一个创建对象的接口,但由子类决定实例化哪个类。Spring中的FactoryBean接口便是工厂方法模式的典型实现。

2.1 工厂方法模式概述

工厂方法模式包含以下角色:

  • 抽象工厂:声明创建产品对象的接口。
  • 具体工厂:实现创建产品对象的具体逻辑。
  • 抽象产品:定义产品的共同接口。
  • 具体产品:实现抽象产品接口的具体对象。

在Spring中,FactoryBean接口定义了一个用于创建Bean实例的工厂方法。

2.2 工厂方法模式在Spring中的实现

源码分析:

FactoryBean接口定义了创建Bean实例的方法:

public interface FactoryBean<T> {
    T getObject() throws Exception;
    Class<?> getObjectType();
    boolean isSingleton();
}

具体工厂类需要实现FactoryBean接口,例如ProxyFactoryBean

public class ProxyFactoryBean implements FactoryBean<Object>, BeanFactoryAware {
    private Object proxy;

    @Override
    public Object getObject() {
        if (this.proxy == null) {
            this.proxy = createAopProxy().getProxy();
        }
        return this.proxy;
    }

    @Override
    public Class<?> getObjectType() {
        return (this.proxy != null ? this.proxy.getClass() : this.targetClass);
    }

    @Override
    public boolean isSingleton() {
        return true;
    }
}

3. 抽象工厂模式

抽象工厂模式提供一个接口,用于创建一系列相关或互相依赖的对象。Spring中的ApplicationContext接口及其实现类如ClassPathXmlApplicationContext便是抽象工厂模式的体现。

3.1 抽象工厂模式概述

抽象工厂模式包含以下角色:

  • 抽象工厂:声明创建一系列相关对象的接口。
  • 具体工厂:实现创建具体产品对象的逻辑。
  • 抽象产品:定义产品的共同接口。
  • 具体产品:实现抽象产品接口的具体对象。

在Spring中,ApplicationContext接口继承了BeanFactory,并提供了更为丰富的功能,如国际化、事件传播等。

3.2 抽象工厂模式在Spring中的实现

源码分析:

ApplicationContext接口继承了BeanFactory接口,并扩展了更多上下文相关的方法:

public interface ApplicationContext extends BeanFactory {
    String getId();
    String getApplicationName();
    String getDisplayName();
    long getStartupDate();
    ApplicationContext getParent();
    AutowireCapableBeanFactory getAutowireCapableBeanFactory() throws IllegalStateException;
}

ClassPathXmlApplicationContextApplicationContext的一个常用实现类,通过解析XML配置文件创建和管理Bean实例:

public class ClassPathXmlApplicationContext extends AbstractXmlApplicationContext {
    public ClassPathXmlApplicationContext(String configLocation) throws BeansException {
        this(new String[] {configLocation}, true, null);
    }

    public ClassPathXmlApplicationContext(String... configLocations) throws BeansException {
        this(configLocations, true, null);
    }

    public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh, ApplicationContext parent) throws BeansException {
        super(parent);
        setConfigLocations(configLocations);
        if (refresh) {
            refresh();
        }
    }
}

结论

通过上述详细分析,我们可以看到Spring框架在其设计和实现中广泛应用了工厂模式,包括简单工厂模式、工厂方法模式和抽象工厂模式。这些设计模式不仅提高了代码的可维护性和可扩展性,还使得Spring框架能够灵活地管理对象的创建和依赖注入。希望本文对理解Spring源码和设计模式的结合有所帮助。

相关推荐

  1. 编程智慧工厂设计模式

    2024-07-22 05:28:02       20 阅读
  2. 编程智慧设计模式

    2024-07-22 05:28:02       20 阅读
  3. 编程智慧设计模式

    2024-07-22 05:28:02       18 阅读
  4. 编程智慧设计模式

    2024-07-22 05:28:02       16 阅读
  5. 并发编程常见设计模式

    2024-07-22 05:28:02       39 阅读
  6. Spring框架种常用设计模式

    2024-07-22 05:28:02       53 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-22 05:28:02       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-22 05:28:02       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-22 05:28:02       45 阅读
  4. Python语言-面向对象

    2024-07-22 05:28:02       55 阅读

热门阅读

  1. 模型瘦身术:目标检测中的剪枝与量化

    2024-07-22 05:28:02       17 阅读
  2. 前端面试题日常练-day100 【Less】

    2024-07-22 05:28:02       15 阅读
  3. C++顶层const和底层const

    2024-07-22 05:28:02       17 阅读
  4. HOW - React 处理不紧急的更新和渲染

    2024-07-22 05:28:02       18 阅读
  5. kafka 基础知识

    2024-07-22 05:28:02       16 阅读
  6. 欧拉路径与欧拉回路

    2024-07-22 05:28:02       19 阅读
  7. Linux grep技巧 提取log中的json数据

    2024-07-22 05:28:02       13 阅读
  8. Python 异常处理

    2024-07-22 05:28:02       14 阅读
  9. Python中的__new__方法及实现单例模式

    2024-07-22 05:28:02       14 阅读
  10. FlowUs横向对比几款笔记应用的优势所在

    2024-07-22 05:28:02       16 阅读
  11. 公式推导类

    2024-07-22 05:28:02       17 阅读