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

工厂模式

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

1. 简单工厂模式

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

1.1 简单工厂模式概述

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

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

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

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

源码分析:

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

java 复制代码
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实例的方法:

java 复制代码
public interface FactoryBean<T> {
    T getObject() throws Exception;
    Class<?> getObjectType();
    boolean isSingleton();
}

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

java 复制代码
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接口,并扩展了更多上下文相关的方法:

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

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

java 复制代码
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源码和设计模式的结合有所帮助。

相关推荐
多弗朗皮卡丘11 小时前
C++特殊类设计
开发语言·c++·设计模式
Carl_奕然12 小时前
【智能体】Loop 的四种设计模式之:Verification Loop(2026 最新版)
人工智能·python·设计模式
是2的10次方啊13 小时前
设计模式与生活③:你的早晨,是一套模板
设计模式
.Hypocritical.1 天前
JUC + 三大设计模式(单例、工厂、代理)
设计模式·juc·1024程序员节
是2的10次方啊1 天前
设计模式与生活②:你只管点外卖,别管堡怎么做
设计模式
是2的10次方啊2 天前
设计模式与生活①:你的脸,为什么不能有第二个?
设计模式
高晶2 天前
ARM 嵌入式 Linux 命令系统 BusyBox 实战指南
linux·设计模式·程序员
高晶2 天前
语音合成与变声技术十大业务场景落地实战:从电商直播到规模化生产
设计模式·程序员
博风2 天前
19、设计模式应用举例:桥接模式:制作电视节目
设计模式·桥接模式
知守观2 天前
从 4 套 PDF 库的混战,聊聊老项目的依赖管理与“静默失败”
java·后端·设计模式