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

工厂模式

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

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值