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

news2024/11/29 2:42:52

前言

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

代码实践

抽象类

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

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 ;
    }

}

枚举类

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

public enum CollectTypeEnum {
    MQTT,
    MODBUS,
    HTTP;
}

子实现类

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

image-20231206233322876

工厂方法

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

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");
        }
    }
}

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

image-20231206233935962

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

最终使用

显示指定枚举参数

image-20231206234338341

处理函数:

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 {
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1291114.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

每天五分钟计算机视觉:通过残差块搭建卷积残差神经网络Resnet

本文重点 随着深度神经网络的层数的增加,神经网络会变得越来越难以训练,之所以这样就是因为存在梯度消失和梯度爆炸问题。本节课程我们将学习跳跃连接方式,它可以从某一网络层获取激活a,然后迅速反馈给另外一层,甚至是神经网络的更深层,从而解决梯度消失的问题。 传统的…

SMART PLC求余指令

SMART PLC求余功能块在伪随机数发生器上的应用请查看下面文章链接&#xff1a; https://rxxw-control.blog.csdn.net/article/details/123793176https://rxxw-control.blog.csdn.net/article/details/123793176待续....

Qt之QGraphicsView —— 笔记1.2:将QGraphicsView放置主窗口上,绘制简单图元(附完整源码)

效果 相关类介绍 QGraphicsView类提供了一个小部件,用于显示QGraphicsScene的内容。QGraphicsView在可滚动视口中可视化。QGraphicsView将滚动其视口,以确保该点在视图中居中。 QGraphicsScene类 提供了一个用于管理大量二维图形项的场景。请注意,QGraphicsScene没有自己的视…

Nginx配置反向代理与负载均衡

Nginx配置反向代理与负载均衡 一、代理服务1.正向代理2.反向代理 二、实战场景-反向代理1.修改nginx配置 -> nginx.conf文件2.修改前端路径 三、实战场景-负载均衡1.热备2.轮询3.加权轮询4.ip_hash ​ Nginx (“engine x”) 是一个高性能的HTTP和反向代理服务器&#xff0c;…

ubuntu22 安装 cuda12.0

本文是先安装显卡驱动后进行的操作 查看显卡驱动支持CUDA的最新版本12.0 nvidia-smi 检查gcc版本 gcc -v 查看系统支持的gcc版本 https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html 选择对应的安装cuda命令 https://developer.nvidia.com/cuda-too…

居民最低生活保障人数数据,2020-2022年数据,shp矢量及表格数据均有!

居民最低生活保障&#xff0c;是国家对共同生活的家庭成员人均收入低于当地最低生活保障标准&#xff0c;且符合当地最低生活保障家庭财产状况规定的家庭&#xff0c;给予最低生活保障。 基本信息. 数据名称: 居民最低生活保障人数数据 数据格式: shpexcel 数据几何类型: 面…

C练习题13

单项选择题(本大题共20小题,每小题2分,共40分。在每小题给出的四个备选项中,选出一个正确的答案,并将所选项前的字母填写在答题纸的相应位置上。) 1.结构化程序由三种基本结构组成、三种基本结构组成的算法是() A.可以完成任何复杂的任务 B. 只能完成部分复杂的任务 C. 只能完…

Fabric:链码的部署及执行

Hyperledger Fabric:V2.5.4 写在最前 使用Fabric搭建自定义网络参考&#xff1a;https://blog.csdn.net/yeshang_lady/article/details/134113296 使用Fabric创建应用通道参考&#xff1a;https://blog.csdn.net/yeshang_lady/article/details/134668458 接下来将介绍如何在自…

配置BFD多跳检测示例

BFD简介 定义 双向转发检测BFD&#xff08;Bidirectional Forwarding Detection&#xff09;是一种全网统一的检测机制&#xff0c;用于快速检测、监控网络中链路或者IP路由的转发连通状况。 目的 为了减小设备故障对业务的影响&#xff0c;提高网络的可靠性&#xff0c;网…

CSS属性 display和visibility的区别

在CSS中&#xff0c;有两种让元素隐藏的方式&#xff0c;分别是display和visibility&#xff0c;他们有什么区别呢&#xff1f; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport"…

数据结构 | 查漏补缺之ASL、线索二叉树、哈夫曼树、大根堆、邻接表邻接矩阵

目录 ASL 情形之一&#xff1a;二分查找 线索二叉树 参考博文 哈夫曼树 参考博文 大根堆 参考博文 邻接表&邻接矩阵 参考博文1 参考博文2 ASL 参考博文 关于ASL(平均查找长度)的简单总结_平均查找长度asl-CSDN博客 情形之一&#xff1a;二分查找 线索二叉树 …

记录 | python向上取整和向下取整

python 向上取整和向下取整 向上取整 使用 ceil()&#xff1a; import mathx 0.55 x0 math.ceil(x)向下取整 使用 floor()&#xff1a; import mathx 0.55 x1 math.floor(x)如下&#xff1a;

文章解读与仿真程序复现思路——中国电机工程学报EI\CSCD\北大核心《计及管网选型与潮流约束的区域综合能源系统分期协同规划》

这个标题涉及到区域综合能源系统的规划&#xff0c;其中考虑了两个关键因素&#xff1a;管网选型和潮流约束。下面对标题中的关键术语进行解读&#xff1a; 区域综合能源系统&#xff1a; 这指的是一个综合考虑多种能源形式&#xff08;比如电力、热能、气体等&#xff09;的系…

Jenkins+Maven+Gitlab+Tomcat 自动化构建打包,部署

环境准备Jenkins工具、环境、插件配置全局变量配置安装插件Deploy to containerMaven Integration plugin配置国内mvn源 创建maven项目 环境准备 1、安装服务 Jenkins工具、环境、插件配置 全局变量配置 Manage Jenkins>tools>JDK 安装 安装插件 Deploy to contai…

网站导航栏下滑隐藏,上滑显示,效果杠杆,兼容性强

前言 导航栏是网站必不可少的一部分&#xff0c;那么&#xff0c;导航栏应该怎么样子实现&#xff0c;可以高效自定义兼容开发呢&#xff1f;当然&#xff0c;不仅要实现&#xff0c;而且还要实现导航栏顶部固定位置&#xff0c;下拉隐藏&#xff0c;稍微往上滑动就会出现&…

Android View的 getHeight 和 getMeasuredHeight 的区别

前言 先简单复习一下Android View 的 绘制顺序&#xff1a; 1、onMeasure&#xff08;测量&#xff09;&#xff0c;先根据构造器传进来的LayoutParams&#xff08;布局参数&#xff09;&#xff0c;测量view宽高。 2、onLayout&#xff08;布局&#xff09;&#xff0c;再根…

鸿蒙HarmonyOS4.0开发应用学习笔记

黑马程序员鸿蒙4.0视频学习笔记&#xff0c;供自己回顾使用。1.安装开发工具DevEco Studio 鸿蒙harmony开发文档指南 DevEco Studio下载地址 选择或者安装环境 选择和下载SDK 安装总览 编辑器界面 2.TypeScript语法 2.1变量声明 //string 、number、boolean、any、u…

【Vue第2章】Vue组件化编程

目录 2.1 模块与组件、模块化与组件化 2.1.1 模块 2.1.2 组件 2.1.3 模块化 2.1.4 组件化 2.2 非单文件组件 2.3.1 代码 2.3.1.1 基本使用 2.3.1.2 几个注意点 2.3.1.3 组件的嵌套 2.3.1.4 VueComponent 2.3.1.5 一个重要的内置关系 2.3 单文件组件 2.3.1 一个.v…

网络安全威胁——计算机病毒

计算机病毒 1. 定义2. 计算机病毒的特点3. 计算机病毒的常见类型和攻击方式4. 如何防御计算机病毒 1. 定义 计算机病毒是计算机程序编制者在计算机程序中插入的破坏计算机功能或者破坏数据&#xff0c;影响计算机使用并且能够自我复制的一组计算机指令或程序代码。因其特点与生…

蓝桥杯每日一题2023.12.4

题目描述 竞赛中心 - 蓝桥云课 (lanqiao.cn) 题目分析 本题使用树型DP&#xff0c;蓝桥杯官网出现了一个点的错误&#xff0c;但实际答案是正确的 状态表示&#xff1a;f[u]&#xff1a;在以u为根的子树中包含u的所有联通块的权值的最大值 假设s1&#xff0c;s2,…sk 是u的…