不要在代码里面写多个if else了
1、工厂注册类
package com.cpmc.cpmcwms.finance.fatory; import cn.hutool.core.text.CharSequenceUtil; import cn.hutool.core.util.ObjectUtil; import com.cpmc.cpmcwms.finance.service.MeasureUnitAbstract; import lombok.experimental.UtilityClass; import java.util.HashMap; import java.util.Map; /** * @author wuzhenyong * ClassName:MeasureUnitFactory.java * date:2022-03-08 13:45 * Description: 工厂模式 */ @UtilityClass public class MeasureUnitFactory { public final static Map<String, MeasureUnitAbstract> MEASURE_UNIT_ABSTRACT_MAP = new HashMap<>(); /** * 获得计量单位服务 * * @param unit 单位 * @return {@link MeasureUnitAbstract} */ public MeasureUnitAbstract getMeasureUnitService(String unit) { return MEASURE_UNIT_ABSTRACT_MAP.get(unit); } /** * 计量单位注册服务 * * @param unit 单位 * @param measureUnitAbstract 注册服务 */ public void registerMeasureUnitService(String unit, MeasureUnitAbstract measureUnitAbstract) { if (CharSequenceUtil.isBlank(unit) || ObjectUtil.isEmpty(measureUnitAbstract)) { return; } MEASURE_UNIT_ABSTRACT_MAP.put(unit, measureUnitAbstract); } }
2、工厂抽象类
package com.cpmc.cpmcwms.finance.service; import com.cpmc.cpmcwms.finance.dto.CostCalculateDTO; import org.springframework.beans.factory.InitializingBean; /** * @author wuzhenyong * ClassName:MeasureUnitAbstract.java * date:2022-03-08 13:40 * Description: */ public abstract class MeasureUnitAbstract implements InitializingBean { // 方法自定义 public void calculateCost(CostCalculateDTO dto) { } }
3、抽象子类
子类1
package com.cpmc.cpmcwms.finance.service.impl; import com.cpmc.cpmcwms.finance.constant.FinanceConstant; import com.cpmc.cpmcwms.finance.dto.CostCalculateDTO; import com.cpmc.cpmcwms.finance.fatory.MeasureUnitFactory; import com.cpmc.cpmcwms.finance.service.MeasureUnitAbstract; import org.springframework.stereotype.Component; /** * @author wuzhenyong * ClassName:MeasureUnitYuanService.java * date:2022-03-08 13:51 * Description:单位元 */ @Component public class MeasureUnitYuanService extends MeasureUnitAbstract { /** * 计算 */ @Override public void calculateCost(CostCalculateDTO dto) { System.out.println("单位元"); } @Override public void afterPropertiesSet() throws Exception { MeasureUnitFactory.registerMeasureUnitService(FinanceConstant.CALCULATE_UNIT_TYPE_ZERO, this); } }
子类2
package com.cpmc.cpmcwms.finance.service.impl; import com.cpmc.cpmcwms.finance.constant.FinanceConstant; import com.cpmc.cpmcwms.finance.dto.CostCalculateDTO; import com.cpmc.cpmcwms.finance.fatory.MeasureUnitFactory; import com.cpmc.cpmcwms.finance.service.MeasureUnitAbstract; import org.springframework.stereotype.Component; /** * @author wuzhenyong * ClassName:MeasureUnitYuanCarService.java * date:2022-03-08 13:51 * Description:单位元/车 */ @Component public class MeasureUnitYuanCarService extends MeasureUnitAbstract { /** * 计算 */ @Override public void calculateCost(CostCalculateDTO dto) { System.out.println("单位元/车"); } @Override public void afterPropertiesSet() throws Exception { MeasureUnitFactory.registerMeasureUnitService(FinanceConstant.CALCULATE_UNIT_TYPE_ONE, this); } }
4、测试类
@Test @SneakyThrows void should_Yuan_success_then_factory_given_0() { MeasureUnitAbstract measureUnitService = MeasureUnitFactory.getMeasureUnitService("0"); measureUnitService.calculateCost(new CostCalculateDTO()); }
控制塔打印