Spring + 设计模式 (一) 创建型-工厂模式

98 阅读4分钟

看完了head first,🧠大脑快宕机了😵‍💫,写个小系列的文章用spring + 设计模式来总结总结,好记性不如烂笔头。

工厂模式(Factory Pattern)

1. 引言

工厂模式是一种创建型设计模式,其核心思想是通过工厂方法来创建对象,而不暴露具体类的实例化过程。它通过定义一个创建对象的接口,使得子类可以决定实例化哪一个类。工厂模式主要解决的问题是对象创建的复杂性以及扩展性,特别是在需要创建不同类型的对象时,避免客户端代码直接依赖于具体类的实现。

2. 实际开发中的用途

在实际开发中,工厂模式通常用于需要创建一类相关对象的场景。它解耦了客户端与具体类之间的依赖关系,客户端只需要依赖工厂接口,而不需要关心具体对象的创建逻辑。比如在图形界面开发中,工厂模式可以用来创建不同类型的按钮、文本框等界面组件;在数据库操作中,可以用工厂模式创建不同类型的数据库连接对象,提升系统的扩展性和灵活性。

3. 开发中的示例

假设在一个订单处理系统中,我们需要根据不同的订单类型(如标准订单、VIP订单)创建不同的处理对象。通过工厂模式,我们可以创建一个订单处理工厂,通过工厂方法来返回不同的订单处理对象,而客户端代码不需要直接创建这些对象,从而降低了耦合度。

// 订单接口
public interface Order {
    void processOrder();
}

// 标准订单
public class StandardOrder implements Order {
    @Override
    public void processOrder() {
        System.out.println("处理标准订单");
    }
}

// VIP订单
public class VIPOrder implements Order {
    @Override
    public void processOrder() {
        System.out.println("处理VIP订单");
    }
}

// 订单工厂
public class OrderFactory {
    public static Order createOrder(String type) {
        if (type.equals("VIP")) {
            return new VIPOrder();
        } else {
            return new StandardOrder();
        }
    }
}

4. Spring源码中的应用

在Spring框架中,工厂模式的应用非常广泛,特别是在Spring IoC容器的实例化过程。Spring容器通过BeanFactory接口和ApplicationContext接口实现了工厂模式,它通过工厂方法来创建和管理各种Bean对象。以下是Spring源码中的一个典型示例:

// Spring的BeanFactory接口
public interface BeanFactory {
    Object getBean(String name);
}

// 具体的工厂实现类:XmlBeanFactory
public class XmlBeanFactory extends AbstractXmlApplicationContext {
    @Override
    public Object getBean(String name) {
        // 根据配置文件创建bean
        return beanFactory.getBean(name);
    }
}

在上面的代码中,XmlBeanFactory作为一个工厂类,根据配置文件的内容创建并返回不同的Bean对象,客户端代码只需要关心获取Bean,而不需要了解Bean的具体创建过程。这种方式有效地降低了客户端与具体实现类之间的耦合度,实现了更好的灵活性和扩展性。

5. 代码案例

工厂模式可以帮助我们动态创建不同类型的服务类对象。

// 服务接口
public interface PaymentService {
    void processPayment();
}

// 支付宝支付服务
public class AlipayPaymentService implements PaymentService {
    @Override
    public void processPayment() {
        System.out.println("使用支付宝支付");
    }
}

// 微信支付服务
public class WechatPaymentService implements PaymentService {
    @Override
    public void processPayment() {
        System.out.println("使用微信支付");
    }
}

// 支付类型枚举
public enum PaymentType {
    ALIPAY {
        @Override
        public PaymentService createService() {
            return new AlipayPaymentService();
        }
    },
    WECHAT {
        @Override
        public PaymentService createService() {
            return new WechatPaymentService();
        }
    };

    // 抽象方法,由每个枚举常量实现
    public abstract PaymentService createService();

}

// 支付服务工厂
public class PaymentServiceFactory {
    public static PaymentService createPaymentService(String type) {
        return PaymentType.fromType(type).createService();
    }
}

// 使用方法
public class Main {
    public static void main(String[] args) {
        PaymentService alipayService = PaymentServiceFactory.createPaymentService(PaymentType.ALIPAY);
        PaymentService wechatService = PaymentServiceFactory.createPaymentService(PaymentType.WECHAT);
        alipayService.processPayment(); // 输出:使用支付宝支付
        wechatService.processPayment(); // 输出:使用微信支付
    }
}

在这个案例中,PaymentServiceFactory负责根据支付方式类型(如支付宝、微信)创建相应的支付服务对象。客户端代码只需调用PaymentServiceFactory.createPaymentService()方法,而无需关心具体的支付方式实现。

6. 总结

工厂模式通过提供一个统一的接口来创建对象,从而隐藏了对象创建的具体细节,提升了系统的可扩展性与灵活性。通过结合Spring框架中的IoC容器,工厂模式能够有效地管理和创建不同类型的Bean,解耦了应用中的对象创建过程。在实际开发中,工厂模式广泛应用于需要动态创建多种类型对象的场景,帮助开发者减少代码的重复性,提升系统的维护性。

(对您有帮助 && 觉得我总结的还行) -> 受累点个免费的赞👍,谢谢