深入浅出简单工厂模式及其在 Spring 框架中的应用

前言

在软件开发过程中,我们经常需要创建各种对象。如果直接在客户端代码中使用 new 关键字来实例化对象,不仅会导致代码耦合度高,还会使系统难以扩展和维护。简单工厂模式通过引入一个工厂类来负责创建对象,降低了客户端与具体类之间的耦合度,提高了代码的灵活性和可维护性。在这篇文章中,我们将详细讲解简单工厂模式,并展示它在 Spring 框架中的应用,特别是使用注解方式进行 Bean 的注入。

什么是简单工厂模式?

简单工厂模式(Simple Factory Pattern)是一种创建型设计模式,通过一个工厂类,根据传入的参数,决定创建哪一种具体产品类的实例。虽然简单工厂模式不属于 GoF 的 23 种设计模式之一,但它在实际开发中非常常用。

动机

在开发过程中,我们常常需要根据不同的条件创建不同的对象。如果直接在代码中使用 new 关键字来实例化对象,会导致代码耦合度高且难以维护。简单工厂模式通过引入一个工厂类来负责创建对象,降低了客户端与具体类之间的耦合度。

结构

简单工厂模式的结构如下:

  1. 产品(Product):定义所有产品对象的公共接口。
  2. 具体产品(ConcreteProduct):实现产品接口的具体类。
  3. 工厂(Factory):根据输入参数,决定创建哪一个具体产品类的实例。

实现简单工厂模式

下面通过一个简单的例子来实现简单工厂模式。假设我们需要创建不同类型的图形对象,例如圆形(Circle)和矩形(Rectangle)。

产品接口

首先,定义一个产品接口 Shape,它包含一个 draw 方法。

// 产品接口
public interface Shape {
    void draw();
}

具体产品类

接下来,创建几种具体的产品类,分别实现 Shape 接口。

// 圆形
public class Circle implements Shape {
    public void draw() {
        System.out.println("Drawing Circle.");
    }
}

// 矩形
public class Rectangle implements Shape {
    public void draw() {
        System.out.println("Drawing Rectangle.");
    }
}

工厂类

然后,创建一个工厂类 ShapeFactory,它包含一个静态方法 createShape,根据传入的形状类型参数创建相应的产品对象。

// 工厂类
public class ShapeFactory {
    public static Shape createShape(String shapeType) {
        if (shapeType == null) {
            return null;
        }
        if (shapeType.equalsIgnoreCase("CIRCLE")) {
            return new Circle();
        } else if (shapeType.equalsIgnoreCase("RECTANGLE")) {
            return new Rectangle();
        }
        return null;
    }
}

客户端代码

最后,在客户端代码中使用工厂类来创建产品对象,并调用其方法。

public class Application {
    public static void main(String[] args) {
        Shape shape1 = ShapeFactory.createShape("CIRCLE");
        shape1.draw();
        
        Shape shape2 = ShapeFactory.createShape("RECTANGLE");
        shape2.draw();
    }
}

在 Spring 框架中的应用

在实际开发中,Spring 框架中的 BeanFactory 是简单工厂模式的一个典型应用。下面我们展示如何使用 Spring 的注解方式来实现 Bean 的注入。

定义 Bean 接口和实现类

首先,定义一个简单的 GreetingService 接口和其实现类 GreetingServiceImpl

public interface GreetingService {
    void sayGreeting();
}

import org.springframework.stereotype.Service;

@Service
public class GreetingServiceImpl implements GreetingService {
    public void sayGreeting() {
        System.out.println("Hello, welcome to Spring!");
    }
}

配置 Spring

接着,在 Spring 配置类中启用组件扫描,确保 Spring 能够发现和注册我们的 GreetingServiceImpl Bean。

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan(basePackages = "com.example")
public class AppConfig {
}

使用 @Autowired 注入 Bean

最后,在客户端代码中使用 @Autowired 注解来注入 GreetingService Bean,并调用其方法。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.stereotype.Component;

@Component
public class SpringApp {

    @Autowired
    private GreetingService greetingService;

    public void run() {
        greetingService.sayGreeting();
    }

    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        SpringApp app = context.getBean(SpringApp.class);
        app.run();
    }
}

总结

简单工厂模式通过引入一个工厂类来创建对象,降低了客户端代码与具体类之间的耦合度,提高了代码的灵活性和可维护性。在电商系统中,我们可以使用简单工厂模式来创建不同类型的支付方式。在实际开发中,Spring 框架中的 BeanFactory 是简单工厂模式的一个典型应用,并且使用注解方式可以更方便地进行 Bean 的注入。

希望这篇文章能帮助你更好地理解简单工厂模式及其在 Spring 中的应用。如果你觉得这篇文章对你有帮助,请给我点个关注和赞!谢谢!

相关推荐

  1. 设计模式及其软件开发应用

    2024-06-19 10:14:02       10 阅读
  2. Spring源码简单工厂模式

    2024-06-19 10:14:02       14 阅读
  3. 如何Spring巧妙应用工厂模式实现解耦

    2024-06-19 10:14:02       16 阅读
  4. Spring相关框架bean及其实例化

    2024-06-19 10:14:02       28 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-19 10:14:02       14 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-19 10:14:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-19 10:14:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-19 10:14:02       18 阅读

热门阅读

  1. 金融行业:银行的三大类业务

    2024-06-19 10:14:02       12 阅读
  2. Vim和Nano简介

    2024-06-19 10:14:02       10 阅读
  3. 产品经理基础入门

    2024-06-19 10:14:02       11 阅读
  4. C# 用RFC的方式调用SAP接口

    2024-06-19 10:14:02       11 阅读
  5. ngrok 进行安全的内网穿透:使用指南

    2024-06-19 10:14:02       14 阅读
  6. 【C语言】信号

    2024-06-19 10:14:02       9 阅读
  7. kotlin 注解 @Parcelize 使用

    2024-06-19 10:14:02       12 阅读
  8. Hadoop+Spark大数据技术(自命题试卷测试)

    2024-06-19 10:14:02       11 阅读
  9. Bash sleep随机时间

    2024-06-19 10:14:02       9 阅读
  10. elasticsearch安装(centos7)

    2024-06-19 10:14:02       6 阅读
  11. Vue3使用component动态展示组件

    2024-06-19 10:14:02       7 阅读