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

前言

以采集数据处理逻辑为例,数据采集分为不同种类如: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;}@Overridepublic void open(Configuration parameters) throws Exception {}@Overridepublic 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);}}@Overridepublic void close() throws Exception {}
}

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

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

相关文章

gpt3、gpt2与gpt1区别

参考&#xff1a;深度学习&#xff1a;GPT1、GPT2、GPT-3_HanZee的博客-CSDN博客 Zero-shot Learning / One-shot Learning-CSDN博客 Zero-shot&#xff08;零次学习&#xff09;简介-CSDN博客 GPT-2 模型由多层单向transformer的解码器部分构成&#xff0c;本质上是自回归模型…

10_企业架构NOSQL数据库之MongoDB

企业架构NOSQL数据库之MongoDB 学习目标和内容 1、能够简单描述MongoDB的使用特点 2、能够安装配置启动MongoDB 3、能够使用命令行客户端简单操作MongoDB 4、能够实现基本的数据操作 5、能够实现MongoDB基本安全设置 6、能够操作安装php的MongoDB扩展 一、背景描述及其方案设计…

Vue实战(十):对数组数据的拆分和分组合并

Vue实战&#xff08;十&#xff09;&#xff1a;对数组数据的拆分和分组合并 数据初始化 //第一种情况 tableData: [{ id: 1, name: ["A", "B"] },{ id: 2, name: ["A", "C"] },{ id: 3, name: ["B", "C"] },{ …

配置阿里云CLI-aliyun命令与安装ossutil

1.aliyun命令官网文档 可以参考文档配置不同账户凭证 https://help.aliyun.com/document_detail/121259.html?spma2c4g.121193.0.i1 使用阿里云 CLI可以参考 https://help.aliyun.com/document_detail/110289.html?spma2c4g.121259.0.0.5ad27f08HvO1dw1&#xff09;账号添加…

springcloud alibaba-Sentinel

文章目录 一.前置知识1.雪崩问题2.服务保护技术对比 二.Sentinel三.微服务整合Sentinel1.限流规则1.流控模式2.流控效果热点参数限流(更细粒度的限流方式) 2.隔离和降级Feign整合Sentinel1.线程隔离2.熔断降级 3.授权规则4.规则持久化 一.前置知识 1.雪崩问题 设想一下以下场…

【C语言】用户空间使用非缓存内存

在用户空间使用非缓存内存通常不是标准做法&#xff0c;因为非缓存内存的操作与硬件平台紧密相关&#xff0c;并且通常被保留给内核模块或设备驱动程序使用。 一、方法 用户空间程序一般不直接处理非缓存内存问题&#xff0c;因为它们依赖于操作系统来管理内存缓存一致性。尽…

AIGC: 关于ChatGPT中基于Whisper模型实现音频转文本

概述 到目前&#xff0c;GPT只能去接收文本的输入&#xff0c;但是在现实的生活当中&#xff0c;会有语音的需求GPT也有相关的能力接入&#xff0c;我们就需要一个能够将语音内容转换成文本的能力 当然其他第三方的软件或者接口也是支持这个功能在 Open AI 有一个语音转文本的…

【五分钟】熟悉np.all()和np.any()的常见用法(干货!!!)

常见使用场景举例 判断numpy数组中是否【全是】非0元素 # 判断数组中是否全是非0元素 a np.array([1, 2, 3, 4]) b np.array([0, 1, 2, 3]) c np.array([np.nan, 1, 2, 3]) # nan --> Not a Number ---> 算非0元素 d np.array([np.inf, 1, 2, 3]) # np.inf -->…

C++使用策略模式,减少使用switch...case...

目录 原理函数类模板函数使用switch...case...不使用switch...case... 知识点decltypestd::remove_reference 原理 函数 #include <iostream> #include <functional> #include <map>void fun1(int a, int b) {std::cout << "fun1 : a "<…

鸿蒙Harmony ArkUI十大开源项目

一 OH哔哩 https://gitee.com/ohos_port/ohbili 项目简介 【OH哔哩】是一款基于OpenHarmony系统ArkUI框架开发的哔哩哔哩动画第三方客户端 用到的三方库 bilibili-API-collect 哔哩哔哩-API收集整理ohos_ijkplayer 基于FFmpeg的视频播放器PullToRefresh 下拉刷新、上拉加载组件…

html css样式选择器介绍

目录 一、单标签选择器二、多标签选择器三、类选择器四、标签结合类选择器五、多个标签结合类选择器六、子标签选择器七、所有子标签选择器八、相邻选择器九、多种选择器混合使用十、超链接样式选择器 一、单标签选择器 下面的 css 会将所有 h1 标签里的文字设置为红色 <!…

【FPGA图像处理实战】- 图像处理前景如何?就业前景如何?

图像处理是FPGA应用的主要领域之一&#xff0c;图像处理数据量特别大且对实时性处理要求高的场景&#xff0c;这恰好能发挥FPGA流水线可实时处理的优势。 那么FPGA图像处理的前景如何&#xff1f; 一、FPGA开发&#xff08;图像处理&#xff09;招聘就业情况 看FPGA图像处理…

c++ memset

memset 函数是 C/C 中的一个函数&#xff0c;用于将一块内存的内容设置为指定的值。在 C 中&#xff0c;你可以使用 #include 头文件来包含 memset 函数的声明。 以下是 memset 函数的基本语法&#xff1a; cpp #include void *memset(void *ptr, int value, size_t num); …

五花八门客户问题(BUG) - 重复打印

根据commit猜测客户问题 git://sourceware.org / glibc.git / commitcommitsummary | shortlog | log | commit | commitdiff | tree (parent: 4573c6b) | patch Dont flush write buffer for ftell author Siddhesh Poyarekar <siddheshredhat.com> Fri, 28 Sep 2012 …

ELK 日志解决方案

ELK 是目前最流行的集中式日志解决方案&#xff0c;提供了对日志收集、存储、展示等一站式的解决方案。 ELK 分别指 Elasticsearch、Logstash、Kibana。 Elasticsearch&#xff1a;分布式数据搜索引擎&#xff0c;基于 Apache Lucene 实现&#xff0c;可集群&#xff0c;提供…

B 站基于 StarRocks 构建大数据元仓

作者&#xff1a;bilibili 大数据高级开发工程师 杨洋 B站大数据元仓是一款用来观测大数据引擎运行情况、推动大作业治理的系统诊断产品。经过调研和性能测试&#xff0c;大数据元仓最终以 StarRocks 为技术底座&#xff0c;从实际的应用效果来看&#xff0c;大部分查询都能在几…

mvn site 命令

概述 在Maven中&#xff0c;site指的是一个特定的阶段&#xff0c;其目的是生成项目相关的站点文档。这些站点文档可以为项目的开发者、用户、以及其他利益相关者提供有关项目的详细信息。 Maven的站点文档通常包括以下内容&#xff1a; 项目信息&#xff1a;这部分提供了关于…

Mysql大数据量删除

Mysql大数据量删除 在一些操作中&#xff0c;可能需要清理一下积压的数据&#xff0c;如果数据量小的话自然没有问题&#xff0c;但是如果是个大数据量的问题&#xff0c;那么就该考虑一个合适的办法了。 在清理大数据量的时候需要考虑是清理部分数据还是清理所有数据&#xf…

【微服务】分布式限流如何实现

Sentinel 是一款阿里巴巴开源的分布式系统级流量控制组件&#xff0c;它提供了流量的自适应控制、熔断降级、系统负载保护等功能。下面是使用 Sentinel 实现分布式限流方案的基本步骤&#xff1a; 引入 Sentinel 依赖&#xff1a;首先在你的 Java 项目中引入 Sentinel 的相关依…

Stm32_串口的帧(不定长)数据接收

目录标题 前言1、串口中断接收固定帧头帧尾数据1.1、任务需求1.2、实现思路1.3、程序源码&#xff1a; 2、串口中断接收用定时器来判断帧结束3、串口中断接收数据空闲中断3.1、串口的空闲中断3.2、实现思路3.3、程序源码 4、串口的空闲中断DMA转运4.1、DMA简介4.2、DMA模式4.3、…