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

工厂模式

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

相关推荐
啦啦啦啦啦zzzz9 小时前
工具:动态类工厂和用配置文件存储属性
c++·设计模式·工具·动态工厂
Nontee14 小时前
设计模式:模板方法与策略,从“每个字都认识“到能说清它们在干嘛
java·数据库·设计模式
choumin16 小时前
行为型模式——模板方法模式
c++·设计模式·模板方法模式·行为型模式
啦啦啦啦啦zzzz19 小时前
设计模式:建造者模式
c++·设计模式·建造者模式
梓仁沐白20 小时前
【Agent 设计模式】推理技术
设计模式
Kinghiee20 小时前
从使用场景切入前端常见设计模式
前端·设计模式
啦啦啦啦啦zzzz2 天前
设计模式:单例模式和工厂模式
c++·单例模式·设计模式·工厂模式
小白说大模型2 天前
Python 工程化设计模式:AI 项目中的异步流水线与策略模式实战
人工智能·python·设计模式
choumin2 天前
行为型模式——中介者模式
c++·设计模式·中介者模式·行为型模式
geovindu3 天前
Java: Chain of Responsibility Pattern
java·开发语言·后端·设计模式·责任链模式·行为模式