设计模式--简单工厂模式之在springboot中使用简单工厂模式

1.前言:

不了解简单工厂模式请先移步:在商城中使用简单工厂。在这里主要是对springboot中使用简单工厂模式进行解析。

2.问题:

什么是简单工厂:它的实现方式是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。

然而在Spring中,在启动容器对时候会通过beanFactory先创建初始化我们要用的类。

一个是要在使用的时候去创建一个产品类,一个是预先已经加载好了我们要使用的对象,那我们要如何解决这个问题呢?

3.场景:在一个商城系统中,用户可以选择三种支付方式,微信支付,支付宝支付,余额支付。

4:方法:

我们只要将要用到的支付方式注入到容器中,我们便可以根据bean到名字去容器中获取。当然只要是很不灵活的。

其次,我们只要再注入一个支付工厂,每次去支付工厂拿自己想要的支付方式。这样我们就可以像之前那样,在自己想要的地方,只需要注入一个支付工厂即可。

5.实现:

步骤1.创建接口类

public interface PaymentMethod {
    void pay();
}

步骤2.实现接口类

//没有指定value,注入的bean默认首字母小写
@Service
public class Alipay implements PaymentMethod {

    @Override
    public void pay() {
        System.out.println("支付宝支付");
    }
}
@Service
public class BalancePay implements PaymentMethod {
    @Override
    public void pay() {
        System.out.println("余额支付");
    }
}
@Service
public class WechatPay implements PaymentMethod {
    @Override
    public void pay() {
        System.out.println("微信支付");
    }
}

步骤3.直接在容器中,根据bean的名字获取需要的对象。

@SpringBootApplication
public class SpringBootSimpleFactoryApplication {

    public static void main(String[] args) {

        ConfigurableApplicationContext context = SpringApplication.run(SpringBootSimpleFactoryApplication.class, args);
//        String[] beans = context.getBeanDefinitionNames();
//        for (String bean:beans) {
//            System.out.println("bean:"+bean);
//        }
        //然而在实际开发中,是不可能经常通过context获取bean的
        PaymentMethod paymentMethod = (PaymentMethod) context.getBean("alipay");
        paymentMethod.pay();
    }

步骤4.创建一个工厂,根据所要给定的信息返回相应的bean

@Service
public class PayFactory {

    @Autowired
    private Alipay alipay;
    @Autowired
    private BalancePay balancePay;
    @Autowired
    private WechatPay wechatPay;

    public PaymentMethod pay(String payType){

        switch (payType){

            case "balancePay":
                return balancePay;
            case "alipay":
                return alipay;
            case "wechatPay":
                return wechatPay;

            default:
                System.out.println("支付方式错误");

        }
        return null;
    }

}

步骤5.在controller层调用支付工厂。(找不到ResponseResult类,请移步单例模式之饿汉模式中获取)

@RestController
public class PayController {

    @Autowired
    private PayFactory payFactory;

    @RequestMapping("pay")
    public ResponseResult pay(String payType){

        ResponseResult responseResult = ResponseResult.getInstance();

        try {
            PaymentMethod paymentMethod = payFactory.pay(payType);
            paymentMethod.pay();
            responseResult.setMsg("操作成功");
            responseResult.setCode(0);
        }catch (Exception e){
            e.printStackTrace();
            responseResult.setMsg("支付类型错误");
            responseResult.setCode(1);
        }

        return responseResult;
    }

}

源码:

在springboot中使用简单工厂模式

在工作中,不能灵活的时候设计模式。希望通过这次的学习,可以加深对设计模式对理解。

接下来会继续整理出自己在工作对时候可以使用对设计模式,不对望指点。如果文章对您有帮助,github给个start吧。

原文地址:https://www.cnblogs.com/boychen/p/10624935.html

时间: 2024-10-27 13:59:02

设计模式--简单工厂模式之在springboot中使用简单工厂模式的相关文章

c#设计模式(1)—— 策略模式在实际项目中的简单应用

1.策略模式应用的核心概念 策略模式是针对一组算法,将每个算法封装到具有公共接口的独立的类中,使他们可以相互替换,策略模式使算法在不影响客户端情况下发生变化. 一个系统需要动态地在几种算法中选择一种的情况下.那么这些算法可以包装到一个个具体的算法类里面,并为这些具体的算法类提供一个统一的接口. 2.场景描述 不同的数据库会有不同的数据访问方式及数据库脚本,采用策略模式可以很好的将数据访问类进行分离,不同的数据访问类只需实现统一的接口,具体的实现方法(不同的数据库执行脚本)在各自的数据访问类中进行

记录一下在SpringBoot中实现简单的登录认证

代码参考博客: https://blog.csdn.net/weixin_37891479/article/details/79527641 在做学校的课设的时候,发现了安全的问题,就不怀好意的用户有可能跳过登录直接访问系统的界面和使用里面的功能,于是想为系统加个安全验证.现在常用的安全框架我知道的就是Shiro还有SpringSecurity,但这次我不打算用框架,采用拦截器filter和session技术实现了一个基于session的登录认证. 先简单地说一下原理: session和cook

SpringBoot 中 Maven 简单的配置

maven 的配置,该配置可以直接部署到linux服务器: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.

数据库设计中的Soft Delete模式

最近几天有点忙,所以我们今天来一篇短的,简单地介绍一下数据库设计中的一种模式——Soft Delete. 可以说,该模式毁誉参半,甚至有非常多的人认为该模式是一个Anti-Pattern.因此在本篇文章中,我们不仅仅会对该模式进行介绍,同时也会列出该模式可能导致的一系列问题,以帮助大家正确地决定是否使用该模式. Soft Delete简介 首先先来想一个需求,那就是对用户操作的回滚支持.例如我现在正在用Word编写这篇文章.当我执行了一个错误操作的时候,我仅仅需要键入Ctrl + Z就可以进行回

Java中的简单工厂模式

举两个例子以快速明白Java中的简单工厂模式: 女娲抟土造人话说:“天地开辟,未有人民,女娲抟土为人.”女娲需要用土造出一个个的人,但在女娲造出人之前,人的概念只存在于女娲的思想里面.女娲造人,这就是简单工厂模式的应用. 首先,在这个造人的思想里面,有几个重要的角色:女娲本身.抽象的人的概念和女娲所造出的一个个具体的人. 1.)女娲是一个工厂类,也就是简单工厂模式的核心角色. 2.)具休的一个个的人,包括张三,李四等.这些人便是简单工厂模式里面的具体产品角色 3.)抽象的人是最早只存在于女娲的头

Java中的简单工厂模式(转)

Java中的简单工厂模式 举两个例子以快速明白Java中的简单工厂模式: 女娲抟土造人话说:“天地开辟,未有人民,女娲抟土为人.”女娲需要用土造出一个个的人,但在女娲造出人之前,人的概念只存在于女娲的思想里面.女娲造人,这就是简单工厂模式的应用. 首先,在这个造人的思想里面,有几个重要的角色:女娲本身.抽象的人的概念和女娲所造出的一个个具体的人. 1.)女娲是一个工厂类,也就是简单工厂模式的核心角色. 2.)具休的一个个的人,包括张三,李四等.这些人便是简单工厂模式里面的具体产品角色 3.)抽象

工厂模式在Unity中的简单应用

使用一个简单的小例子来说明Unity开发中如何使用工厂模式来获取精灵并且加载 1.创建个Unity的工程,起名叫FactoryDemo,并在Asset下创建相应文件夹 Sprite用来存放原图以及分割后的精灵, 2.Sprite里添加所需的图片,Number. 原图效果如下: 3. 对导入的Number修改Texture属性 设置如下 点击Sprite Editor,对贴图进行分割生成精灵 最后点击Slice切片,Sprite文件夹中的原图出现一个向右的小键头,点击后可以看到1-0 10张的精灵

单例模式是设计模式中最简单的形式之一

单例模式是设计模式中最简单的形式之一.这一模式的目的是使得类的一个对象成为系统中的唯一实例.要实现这一点,可以从客户端对其进行实例化开始.因此需要用一种只允许生成对象类的唯一实例的机制,"阻止"所有想要生成对象的访问.使用工厂方法来限制实例化过程.这个方法应该是静态方法(类方法),因为让类的实例去生成另一个唯一实例毫无意义 意图: 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 适用性: 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时. 当这个唯一实例应该是通过子

设计模式:工厂方法模式(Factory Method)和抽象工厂模式(Abstact Factory)

?在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之前必须先生成一些辅助功能的对象. 在这些情况,新对象的建立就是一个 "过程",不仅是一个操作,像一部大机器中的一个齿轮传动. 分类 ?工厂模式主要是为创建对象提供过渡接口,以便将创建对象的