使用工厂设计模式消除多个if-switch,简单易懂,代码解耦!

1.来活了

最近来了个给订单打标签的任务,大致功能是这样的,可支持给订单打标签,每个标签不仅是只打上一个label,还需要添加对应的备注,原因,反正就是不同的标签看似操作相同,但内部操作是可拓展的。

2.编码完毕

我一想这不简单吗?一下子写完了代码,就像这样,多个switch解决,之后再有标签就不断的在该类中加入private方法即可。

在这里插入图片描述

代码如下所示。

@Service
public class OrderService {

    @Autowired
    private OrderMapper orderMapper;

    public void addLabelOld(Integer labelCode) {
        // 一个方法搞定
        switch (labelCode) {
            case 1:
                // 促销订单
                break;
            case 2:
                // 重要客户
                break;
            case 3:
                // 优先处理
                break;
        }
    }
    public void removeLabelOld(Integer labelCode) {
        // 一个方法搞定
        switch (labelCode) {
            case 1:
                // 促销订单
                break;
            case 2:
                // 重要客户
                break;
            case 3:
                // 优先处理
                break;
        }
    }
}

3.思考

但我转念一想,都工作好几年了,代码要写的可维护,这段代码不能说有功能问题,但不够好,我要追求的优雅些,且还有时间优化,不如搞一波新的吧。

4.重新设计

不是有那么多的switch嘛,天然可以用工厂方法来简化,于是就有了下面的一版。

4.1 添加移除标签接口类

public interface IOrderLabelService {

    void add();

    void remove();
}

4.2 标签接口实现类

/**
 * 促销订单标签
 *@author sharpbb 2024/8/21
 */

public class PromotionOrderServiceImpl implements IOrderLabelService{
    @Override
    public void add() {

    }

    @Override
    public void remove() {

    }
}

/**
 * 重要客户标签
 *@author sharpbb 2024/8/21
 */

public class ImportantCustomersServiceImpl implements IOrderLabelService{
    @Override
    public void add() {

    }

    @Override
    public void remove() {

    }
}


/**
 * 优先处理订单
 *@author sharpbb 2024/8/21
 */

public class PriorityProcessingServiceImpl implements IOrderLabelService{
    @Override
    public void add() {

    }

    @Override
    public void remove() {

    }
}

4.3 核心工厂类

通过该方法的map获取对应的service,方便调用。

/**
 *@author sharpbb 2024/8/21
 */
@Component
public class OrderLabelBeanFactory {

    // 在类初始化时,构建一个映射表
    private final Map<Integer, Class<? extends IOrderLabelService>> serviceMap = new HashMap<>();

    @PostConstruct
    public void init() {
        // 有其他标签则往下加 应该用枚举 这里省事了
        //1.促销订单
        //2.重要客户
        //3.优先处理
        serviceMap.put(1, PromotionOrderServiceImpl.class);
        serviceMap.put(2, ImportantCustomersServiceImpl.class);
        serviceMap.put(3, PriorityProcessingServiceImpl.class);

    }

    // 获取对应的订单标签实现类
    public IOrderLabelService getOrderLabelService(Integer value) {
        Class<? extends IOrderLabelService> serviceClass = serviceMap.get(value);
        if (serviceClass != null) {
            return SpringContextUtil.getBean(serviceClass);
        } else {
            throw new RuntimeException(StrUtil.format("未知的标签类型{},不支持!" , value));
        }
    }
}

4.4 service方法

只需要通过工厂方法传递code即可拿到对应实现,完成相应的调用。


@Service
public class OrderService {

    @Autowired
    private OrderMapper orderMapper;
    @Autowired
    private OrderLabelBeanFactory orderLabelBeanFactory;

    public void addLabelNew(Integer labelCode) {
        IOrderLabelService orderLabelService = orderLabelBeanFactory.getOrderLabelService(labelCode);
        orderLabelService.add();
    }
    public void removeLabelNew(Integer labelCode) {
        IOrderLabelService orderLabelService = orderLabelBeanFactory.getOrderLabelService(labelCode);
        orderLabelService.remove();
    }
}

编码完毕,我嘻嘻一笑。
在这里插入图片描述

5.总结

这只是个小demo,但我认为通过该工厂设计模式能够很大程度的改善那些臃肿的代码,要知道,类并不值钱,多创建一些类来去耦合,是很必要的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值