目录
一.为什么要用策略工厂解决问题
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.更加易于维护
这个是使用策略工厂模式的两点很明显的好处,但是策略模式建议也不要滥用,使用策略模式的一大缺点就是会导致类膨胀。