【策略工厂模式】使用策略工厂模式解决if else过多的问题

目录

一.为什么要用策略工厂解决问题

1.1 使用策略模式之前:

1.2使用策略模式之后:

二.怎么用策略工厂模式解决问题

2.1 创建枚举类

2.2  创建抽象类

 2.3 创建工厂类

2.4 编写子类型

三. 意义


一.为什么要用策略工厂解决问题

        hello 大家,今天想给大家带来的分享是,如何解决我们项目中if else过多的问题,相信大多数开发在开发业务代码的时候都写过很多的if else。if else少的时候,其实我们也不需要去关心。但是一旦if else多了起来,就会导致我们的代码可读性非常差。后期难以维护,所以当if else过多的时候,建议使用策略模式和工厂模式解决这个问题。好了,废话不多说。

1.1 使用策略模式之前:

@Component
public class BeforeStrategyTest {

    public Double getPrice(FruitEnum fruitEnum){

        if(fruitEnum.equals(FruitEnum.APPLE)){
            return 10.0;
        }
        if(fruitEnum.equals(FruitEnum.BANANA)){
            return 20.0;
        }
        if(fruitEnum.equals(FruitEnum.PLUM)){
            return 30.0;
        }
        return 0.0;
    }
}

1.2使用策略模式之后:

@Component
public class AfterStrategyTest {

    public Double getPrice(FruitEnum fruitEnum){

        return FruitFactory.getInvokeStrategyMap(fruitEnum).getPrice();

    }
}

二.怎么用策略工厂模式解决问题

2.1 创建枚举类

创建一个枚举类去handler所有的种类,把枚举当成map的key

public enum FruitEnum {
    APPLE,BANANA,PLUM
}

2.2  创建抽象类

创建一个抽象类去做一个模版类

public abstract class FruitHandler implements InitializingBean {

    public String getName(){
        return "fruit";
    }

    public Double getPrice(){
        return 0.0;
    }
}

 2.3 创建工厂类

这个工厂类的做用就是把所有的子类型,注册到这个工厂里面,到时候根据每个字类型的key拿到对应的类型去调各自的方法

public class FruitFactory {

    private static Map<FruitEnum,FruitHandler> strategyMap = new ConcurrentHashMap<>();

    public static FruitHandler getInvokeStrategyMap(FruitEnum fruitEnum) {
        return strategyMap.get(fruitEnum);
    }

    public static void register(FruitEnum fruitEnum, FruitHandler handler) {
        if (null == fruitEnum || null == handler) {
            return;
        }
        strategyMap.put(fruitEnum, handler);
    }
}

2.4 编写子类型

写了工厂类之后,后面加字类型到工厂中的时候,需要注册到工厂。

@Component
public class AppleHandler extends FruitHandler {

    @Override
    public String getName() {
        return "Apple";
    }

    @Override
    public Double getPrice() {
        return 10.0;
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        FruitFactory.register(FruitEnum.APPLE,this);
    }
}
@Component
public class BananaHandler extends FruitHandler{

    @Override
    public String getName() {
        return "Banana";
    }

    @Override
    public Double getPrice() {
        return 20.0;
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        FruitFactory.register(FruitEnum.BANANA,this);
    }
}
@Component
public class PlumHandler extends FruitHandler{

    @Override
    public String getName() {
        return "Plum";
    }

    @Override
    public Double getPrice() {
        return 30.0;
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        FruitFactory.register(FruitEnum.PLUM,this);
    }
}

三. 意义

1.更好的可读性

2.更加易于维护

这个是使用策略工厂模式的两点很明显的好处,但是策略模式建议也不要滥用,使用策略模式的一大缺点就是会导致类膨胀。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值