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

前言

以采集数据处理逻辑为例,数据采集分为不同种类如: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 {
    }
}
相关推荐
代码之光_198022 分钟前
保障性住房管理:SpringBoot技术优势分析
java·spring boot·后端
ajsbxi28 分钟前
苍穹外卖学习记录
java·笔记·后端·学习·nginx·spring·servlet
StayInLove1 小时前
G1垃圾回收器日志详解
java·开发语言
对许1 小时前
SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder“
java·log4j
无尽的大道1 小时前
Java字符串深度解析:String的实现、常量池与性能优化
java·开发语言·性能优化
小鑫记得努力1 小时前
Java类和对象(下篇)
java
binishuaio1 小时前
Java 第11天 (git版本控制器基础用法)
java·开发语言·git
zz.YE1 小时前
【Java SE】StringBuffer
java·开发语言
老友@1 小时前
aspose如何获取PPT放映页“切换”的“持续时间”值
java·powerpoint·aspose
wrx繁星点点1 小时前
状态模式(State Pattern)详解
java·开发语言·ui·设计模式·状态模式