【工厂方法】设计模式项目实践

前言

以采集数据处理逻辑为例,数据采集分为不同种类如:MQTT、MODBUS、HTTP等,不同的采集数据有不同的解析处理逻辑。但总体解析处理步骤是固定的。可以使用工厂方法设计模式简化代码,让代码变得更加优雅。

代码实践

抽象类

总体步骤一致,先声明一个抽象类包含所有处理步骤,具体处理步骤由不同子类自行实现。【大体处理框架

java 复制代码
public abstract class AbstractCollectService {

    protected abstract Boolean handleAlarm(CollectDataMessage message);

    protected abstract Boolean handleCollect(CollectDataMessage message);

    public CollectDataMessage parseKafkaMessage(String kafkaMessage, CollectTypeEnum collectTypeEnum){
        // 工厂方法
        return CollectFactory.getInstance(collectTypeEnum).parseKafkaMessage2DataMessage(kafkaMessage);
    }

    protected abstract CollectDataMessage parseKafkaMessage2DataMessage(String kafkaMessage);

    public Boolean doHandle(CollectDataMessage message) {
        Boolean ret;
        switch (message.getHandleTypeEnum()){
            case ALARM:
                ret = handleAlarm(message) ;
                break ;
            case COLLECT:
                ret = handleCollect(message) ;
                break ;
            default:
                ret = false ;
        }
        return ret ;
    }

}

枚举类

采集数据枚举类与子实现类一一对应

java 复制代码
public enum CollectTypeEnum {
    MQTT,
    MODBUS,
    HTTP;
}

子实现类

不同采集数据的子类处理逻辑,各自实现抽象类中抽象方法(核心逻辑)。

工厂方法

定义工厂方法,使用枚举做判断条件,真正处理不同逻辑时,需要显示地传出对应枚举参数以便得到对应实现类对象。

java 复制代码
public class CollectFactory {

    public static AbstractCollectService getInstance(CollectTypeEnum collectTypeEnum) {
        switch (collectTypeEnum) {
            case MQTT:
                return MqttCollectService.getInstance();
            case MODBUS:
                return ModbusCollectService.getInstance();
            case HTTP:
                return HttpCollectService.getInstance();
            default:
                throw new IllegalArgumentException("Unknown collect type");
        }
    }
}

具体子类对象,都是采用【基于类初始化】获取的单例对象。随便一个为例,其他子类同理。

简单的工厂方法设计模式就这样实现了~

最终使用

显示指定枚举参数

处理函数:

java 复制代码
public class KafkaMsg2CollectMsgRichMapFunction extends RichMapFunction<String, CollectDataMessage> {

    private static final Logger log = LoggerFactory.getLogger(KafkaMsg2CollectMsgRichMapFunction.class) ;


    private final CollectTypeEnum collectTypeEnum;

    public KafkaMsg2CollectMsgRichMapFunction(CollectTypeEnum collectTypeEnum) {
        this.collectTypeEnum = collectTypeEnum;
    }

    @Override
    public void open(Configuration parameters) throws Exception {
    }

    @Override
    public CollectDataMessage map(String kafkaMessage) {
        try {
            // 根据显示指定的枚举类,获取对应子类实现相应逻辑
            AbstractCollectService collectService = CollectFactory.getInstance(collectTypeEnum);
            return collectService.parseKafkaMessage(kafkaMessage, collectTypeEnum);
        } catch (RuntimeException e) {
            log.info("解析采集数据异常", e);
            throw new RuntimeException(e);
        }
    }

    @Override
    public void close() throws Exception {
    }
}
相关推荐
正在走向自律2 分钟前
Java连接电科金仓数据库(KingbaseES)实战指南
java·数据库·oracle·国产数据库·kingbase
xiaoye37088 分钟前
Java 事务失效场景全解析
java
weixin_4365250723 分钟前
Spring Boot 集成 EasyExcel 的最佳实践:优雅实现 Excel 导入导出
java·spring boot·后端
ChinaRainbowSea26 分钟前
9. LangChain4j + 整合 Spring Boot
java·人工智能·spring boot·后端·spring·langchain·ai编程
ゞ 正在缓冲99%…28 分钟前
leetcode35.搜索插入位置
java·算法·leetcode·二分查找
武昌库里写JAVA36 分钟前
Mac下Python3安装
java·vue.js·spring boot·sql·学习
青草地溪水旁40 分钟前
设计模式(C++)详解—原型模式(1)
c++·设计模式·原型模式
程序员清风1 小时前
滴滴三面:ZGC垃圾收集器了解吗?
java·后端·面试
扯淡的闲人1 小时前
多语言编码Agent解决方案(4)-Eclipse插件实现
java·ide·eclipse
杨杨杨大侠2 小时前
Atlas Mapper 教程系列 (7/10):单元测试与集成测试
java·开源·github