当前位置: 首页 > news >正文

深入浅出简单工厂模式及其在 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 {@Autowiredprivate 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 中的应用。如果你觉得这篇文章对你有帮助,请给我点个关注和赞!谢谢!

相关文章:

  • 【专业英语 复习】第9章 Privacy, Security,and Ethics
  • 【Flask】学习
  • 丰臣秀吉-读书笔记六
  • 沙奇里再造世界波,容声注定与经典结缘
  • 如何验证证书的合法性
  • MaxWell实时监控Mysql并把数据写入到Kafka主题中
  • Linux下VSCode的安装和基本使用
  • 数组和链表的区别是什么?
  • Pycharm怎么默认终端连接远程服务器
  • 【因果推断python】50_去偏/正交机器学习2
  • 深入讲解C++基础知识(一)
  • 内容安全复习 7 - 对抗攻击与防御
  • mac电脑守护神CleanMyMac2024免费版本下载
  • 安卓为啥要加签名机制
  • Spring-bean
  • [笔记] php常见简单功能及函数
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • co.js - 让异步代码同步化
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • Javascripit类型转换比较那点事儿,双等号(==)
  • Meteor的表单提交:Form
  • Python 基础起步 (十) 什么叫函数?
  • 程序员该如何有效的找工作?
  • 代理模式
  • 检测对象或数组
  • 深入浅出webpack学习(1)--核心概念
  • 微信小程序实战练习(仿五洲到家微信版)
  • 我的面试准备过程--容器(更新中)
  • ​数据链路层——流量控制可靠传输机制 ​
  • ​业务双活的数据切换思路设计(下)
  • # centos7下FFmpeg环境部署记录
  • $.each()与$(selector).each()
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (¥1011)-(一千零一拾一元整)输出
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (1)SpringCloud 整合Python
  • (10)ATF MMU转换表
  • (7)STL算法之交换赋值
  • (C++20) consteval立即函数
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (接口封装)
  • (九十四)函数和二维数组
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • .NET 分布式技术比较
  • .net6 当连接用户的shell断掉后,dotnet会自动关闭,达不到长期运行的效果。.NET 进程守护
  • .net知识和学习方法系列(二十一)CLR-枚举
  • .NET中 MVC 工厂模式浅析
  • .set 数据导入matlab,设置变量导入选项 - MATLAB setvaropts - MathWorks 中国
  • @Controller和@RestController的区别?