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吧。

03-30 12:33