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

前言

以采集数据处理逻辑为例,数据采集分为不同种类如: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 {
    }
}
相关推荐
上海合宙LuatOS4 分钟前
LuatOS核心库API——【json 】json 生成和解析库
java·前端·网络·单片机·嵌入式硬件·物联网·json
没有bug.的程序员4 分钟前
金融风控系统:实时规则引擎内核、决策树物理建模与 Drools 性能压榨
java·数据库·决策树·金融·drools·物理建模·实时规则
0x539 分钟前
JAVA|面向对象
java
NGC_661113 分钟前
插入排序算法
java·数据结构·算法
驴儿响叮当201015 分钟前
设计模式之状态模式
设计模式·状态模式
西门吹-禅18 分钟前
【eclipse 升级】
java·ide·eclipse
Seven9722 分钟前
剑指offer-78、求平⽅根
java
玄〤23 分钟前
个人博客网站搭建day6--Spring Boot自定义RedisTemplate配置:优化序列化与Java8时间类型支持
java·spring boot·redis·后端·spring
知我Deja_Vu23 分钟前
@Transactional 与 @Transactional(rollbackFor = Exception.class) 的区别详解
java·spring
敲敲千反田24 分钟前
CAS和AQS相关问题
java