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

工厂模式

工厂模式是一种创建型设计模式,它通过定义一个创建对象的接口,让子类决定实例化哪个类。工厂模式使得一个类的实例化延迟到其子类。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;
}

ClassPathXmlApplicationContextApplicationContext的一个常用实现类,通过解析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源码和设计模式的结合有所帮助。

相关推荐
平凡之路无尽路3 小时前
智能体设计模式:构建智能系统的实践指南
人工智能·设计模式·自然语言处理·nlp·aigc·vllm
冷崖17 小时前
工厂模式-创建型
c++·设计模式
何中应21 小时前
【面试题-5】设计模式
java·开发语言·后端·设计模式·面试题
沐森1 天前
在实战中运用泛型和动态trait(特质)
设计模式
lomocode1 天前
改一个需求动 23 处代码?你可能踩进了这个坑
后端·设计模式
喷火龙8号1 天前
JWT 认证方案深度对比:单 Token 扩展刷新 vs 双 Token 验证
后端·设计模式·架构
fakerth2 天前
【OpenHarmony】设计模式模块详解
c++·单例模式·设计模式·openharmony
alibli2 天前
一文学会设计模式之创建型模式及最佳实现
c++·设计模式
1024肥宅2 天前
前端常用模式:提升代码质量的四大核心模式
前端·javascript·设计模式
郝学胜-神的一滴2 天前
设计模式依赖于多态特性
java·开发语言·c++·python·程序人生·设计模式·软件工程