java spring设计模式 之 工厂模式


不要在代码里面写多个if else了

1、工厂注册类

package com.finance.fatory;

import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.core.util.ObjectUtil;
import com.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.finance.service;

import com.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.finance.service.impl;

import com.finance.constant.FinanceConstant;
import com.finance.dto.CostCalculateDTO;
import com.finance.fatory.MeasureUnitFactory;
import com.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.finance.service.impl;

import com.finance.constant.FinanceConstant;
import com.finance.dto.CostCalculateDTO;
import com.finance.fatory.MeasureUnitFactory;
import com.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());
    }

控制塔打印

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IswhmGJo-1650973374232)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20220308141245260.png)]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个小浪吴啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值