在商城系统中使用设计模式简单工厂模式之在springboot中使用简单工厂模式

摘要:
在这里主要是对springboot中使用简单工厂模式进行解析。然而在Spring中,在启动容器对时候会通过beanFactory先创建初始化我们要用的类。@RestControllerpublicclassPayController{@AutowiredprivatePayFactorypayFactory;@RequestMappingpublicResponseResultpay{ResponseResultresponseResult=ResponseResult.getInstance();try{PaymentMethodpaymentMethod=payFactory.pay;paymentMethod.pay();responseResult.setMsg;responseResult.setCode;}catch{e.printStackTrace();responseResult.setMsg;responseResult.setCode;}returnresponseResult;}}源码:在springboot中使用简单工厂模式在工作中,不能灵活的时候设计模式。接下来会继续整理出自己在工作对时候可以使用对设计模式,不对望指点。

1.前言:

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

2.问题:

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

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

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

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

4:方法:

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

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

5.实现:

步骤1.创建接口类

public interfacePaymentMethod {
    voidpay();
}

步骤2.实现接口类

//没有指定value,注入的bean默认首字母小写
@Service
public class Alipay implementsPaymentMethod {
    
    @Override
    public voidpay() {
        System.out.println("支付宝支付");
    }
}
@Service
public class BalancePay implementsPaymentMethod {
    @Override
    public voidpay() {
        System.out.println("余额支付");
    }
}
@Service
public class WechatPay implementsPaymentMethod {
    @Override
    public voidpay() {
        System.out.println("微信支付");
    }
}

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

@SpringBootApplication
public classSpringBootSimpleFactoryApplication {

    public static voidmain(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 classPayFactory {

    @Autowired
    privateAlipay alipay;
    @Autowired
    privateBalancePay balancePay;
    @Autowired
    privateWechatPay wechatPay;

    publicPaymentMethod pay(String payType){

        switch(payType){

            case "balancePay":
                returnbalancePay;
            case "alipay":
                returnalipay;
            case "wechatPay":
                returnwechatPay;

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

        }
        return null;
    }

}

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

@RestController
public classPayController {

    @Autowired
    privatePayFactory payFactory;

    @RequestMapping("pay")
    publicResponseResult 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);
        }

        returnresponseResult;
    }

}

源码:

在springboot中使用简单工厂模式

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

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

免责声明:文章转载自《在商城系统中使用设计模式简单工厂模式之在springboot中使用简单工厂模式》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇poj 2942 Knights of the Round Table(无向图的双连通分量+二分图判定)springcloud(12)SentinelResource注解配置应用及其他下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Spring 的 @Primary 注解

简单的说,就是当Spring容器扫描到某个接口的多个 bean时,如果某个bean上加了@Primary 注解 ,则这个bean会被优先选用,如下面的例子: @Component public classFooService { privateFooRepository fooRepository; @Autowired...

Java Web开发之详解JSP

JSP作为Java Web开发中比较重要的技术,一般当作视图(View)的技术所使用,即用来展现页面。Servlet由于其本身不适合作为表现层技术,所以一般被当作控制器(Controller)所使用,而JavaBean作为模型(Model)层使用。这就是经典的MVC模型。 Servlet和JSP的关系上篇博客已经讲过了,并演示了一个相当简单的例子。在具体讲...

全网最通俗易懂理清mybatis中SqlSession、SqlSessionTemplate、SessionFactory和SqlSessionFactoryBean之间的关系

摘自:https://www.cnblogs.com/xiaoming0601/p/12166160.html 我潇洒的灰大狼又回来啦。今天送大家的一句话是: 保持耐心,永远年轻,永远热泪盈眶。 前言 先容我哭一会儿,呜呜呜~昨晚写了一半的文章,还没保存就盖上盖子准备回家,拔下电源准备把电脑塞进书包带回家完成时,懒惰阻止了我,最终还是没带回家,于是,遭报...

spring5 源码深度解析----- AOP的使用及AOP自定义标签

我们知道在面向对象OOP编程存在一些弊端,当需要为多个不具有继承关系的对象引入同一个公共行为时,例如日志,安全检测等,我们只有在每个对象里引入公共行为,这样程序中就产生了大量的重复代码,所以有了面向对象编程的补充,面向切面编程(AOP),AOP所关注的方向是横向的,不同于OOP的纵向。接下来我们就详细分析下spring中的AOP。首先我们从动态AOP的使用...

Shiro快速入门

写在前面:   最近项目中使用了Shiro,虽然不是自己在负责这一块,但还是抽空学习了下,也可以让自己对shiro有基本的了解。毕竟Shiro安全框架在项目中还是挺常用的。   对于Apache Shiro的基本概念就不在这里一一描述了,资料网上都有,主要还是记录下代码相关的,能够先让自己快速学会使用。   这里的demo(可以测试登录认证,登出,以及授权...

使用Java反射机制将Bean对象转换成Map(驼峰命名方式 — 下划线命名方式)

packagecom.yunping.asap.core.util; importjava.beans.PropertyDescriptor; importjava.lang.reflect.Field; importjava.lang.reflect.Method; importjava.util.ArrayList; importjava.util....