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

前言

以采集数据处理逻辑为例,数据采集分为不同种类如: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 {
    }
}
相关推荐
wellc34 分钟前
SpringBoot集成Flowable
java·spring boot·后端
Hui Baby1 小时前
springAi+MCP三种
java
hsjcjh1 小时前
【MySQL】C# 连接MySQL
java
敖正炀1 小时前
LinkedBlockingDeque详解
java
wangyadong3171 小时前
datagrip 链接mysql 报错
java
untE EADO1 小时前
Tomcat的server.xml配置详解
xml·java·tomcat
ictI CABL2 小时前
Tomcat 乱码问题彻底解决
java·tomcat
敖正炀2 小时前
DelayQueue 详解
java
敖正炀2 小时前
PriorityBlockingQueue 详解
java
shark22222222 小时前
Spring 的三种注入方式?
java·数据库·spring