java spring设计模式 之 工厂模式

简介: java spring设计模式 之 工厂模式

不要在代码里面写多个if else了

1、工厂注册类

package com.cpmc.cpmcwms.finance.fatory;
import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.core.util.ObjectUtil;
import com.cpmc.cpmcwms.finance.service.MeasureUnitAbstract;
import lombok.experimental.UtilityClass;
import java.util.HashMap;
import java.util.Map;
/**
 * @author wuzhenyong
 * ClassName:MeasureUnitFactory.java
 * date:2022-03-08 13:45
 * Description: 工厂模式
 */
@UtilityClass
public class MeasureUnitFactory {
    public final static Map<String, MeasureUnitAbstract> MEASURE_UNIT_ABSTRACT_MAP = new HashMap<>();
    /**
     * 获得计量单位服务
     *
     * @param unit 单位
     * @return {@link MeasureUnitAbstract}
     */
    public MeasureUnitAbstract getMeasureUnitService(String unit) {
        return MEASURE_UNIT_ABSTRACT_MAP.get(unit);
    }
    /**
     * 计量单位注册服务
     *
     * @param unit                单位
     * @param measureUnitAbstract 注册服务
     */
    public void registerMeasureUnitService(String unit, MeasureUnitAbstract measureUnitAbstract) {
        if (CharSequenceUtil.isBlank(unit) || ObjectUtil.isEmpty(measureUnitAbstract)) {
            return;
        }
        MEASURE_UNIT_ABSTRACT_MAP.put(unit, measureUnitAbstract);
    }
}

2、工厂抽象类

package com.cpmc.cpmcwms.finance.service;
import com.cpmc.cpmcwms.finance.dto.CostCalculateDTO;
import org.springframework.beans.factory.InitializingBean;
/**
 * @author wuzhenyong
 * ClassName:MeasureUnitAbstract.java
 * date:2022-03-08 13:40
 * Description:
 */
public abstract class MeasureUnitAbstract implements InitializingBean {
    // 方法自定义
    public void calculateCost(CostCalculateDTO dto) { }
}

3、抽象子类

子类1

package com.cpmc.cpmcwms.finance.service.impl;
import com.cpmc.cpmcwms.finance.constant.FinanceConstant;
import com.cpmc.cpmcwms.finance.dto.CostCalculateDTO;
import com.cpmc.cpmcwms.finance.fatory.MeasureUnitFactory;
import com.cpmc.cpmcwms.finance.service.MeasureUnitAbstract;
import org.springframework.stereotype.Component;
/**
 * @author wuzhenyong
 * ClassName:MeasureUnitYuanService.java
 * date:2022-03-08 13:51
 * Description:单位元
 */
@Component
public class MeasureUnitYuanService extends MeasureUnitAbstract {
    /**
     * 计算
     */
    @Override
    public void calculateCost(CostCalculateDTO dto) {
        System.out.println("单位元");
    }
    @Override
    public void afterPropertiesSet() throws Exception {
        MeasureUnitFactory.registerMeasureUnitService(FinanceConstant.CALCULATE_UNIT_TYPE_ZERO, this);
    }
}

子类2

package com.cpmc.cpmcwms.finance.service.impl;
import com.cpmc.cpmcwms.finance.constant.FinanceConstant;
import com.cpmc.cpmcwms.finance.dto.CostCalculateDTO;
import com.cpmc.cpmcwms.finance.fatory.MeasureUnitFactory;
import com.cpmc.cpmcwms.finance.service.MeasureUnitAbstract;
import org.springframework.stereotype.Component;
/**
 * @author wuzhenyong
 * ClassName:MeasureUnitYuanCarService.java
 * date:2022-03-08 13:51
 * Description:单位元/车
 */
@Component
public class MeasureUnitYuanCarService extends MeasureUnitAbstract {
    /**
     * 计算
     */
    @Override
    public void calculateCost(CostCalculateDTO dto) {
        System.out.println("单位元/车");
    }
    @Override
    public void afterPropertiesSet() throws Exception {
        MeasureUnitFactory.registerMeasureUnitService(FinanceConstant.CALCULATE_UNIT_TYPE_ONE, this);
    }
}

4、测试类

@Test
    @SneakyThrows
    void should_Yuan_success_then_factory_given_0() {
        MeasureUnitAbstract measureUnitService = MeasureUnitFactory.getMeasureUnitService("0");
        measureUnitService.calculateCost(new CostCalculateDTO());
    }

控制塔打印

0f9790d20cd44c6fb4d0c4662fbe6e98.png

相关文章
|
17天前
|
人工智能 Java API
Java也能快速搭建AI应用?一文带你玩转Spring AI可落地性
Java语言凭借其成熟的生态与解决方案,特别是通过 Spring AI 框架,正迅速成为 AI 应用开发的新选择。本文将探讨如何利用 Spring AI Alibaba 构建在线聊天 AI 应用,并实现对其性能的全面可观测性。
190 11
|
4月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
145 2
|
12天前
|
人工智能 Java API
Java 也能快速搭建 AI 应用?一文带你玩转 Spring AI 可观测性
Java 也能快速搭建 AI 应用?一文带你玩转 Spring AI 可观测性
|
2月前
|
存储 NoSQL Java
使用Java和Spring Data构建数据访问层
本文介绍了如何使用 Java 和 Spring Data 构建数据访问层的完整过程。通过创建实体类、存储库接口、服务类和控制器类,实现了对数据库的基本操作。这种方法不仅简化了数据访问层的开发,还提高了代码的可维护性和可读性。通过合理使用 Spring Data 提供的功能,可以大幅提升开发效率。
79 21
|
1月前
|
网络协议 Java Shell
java spring 项目若依框架启动失败,启动不了服务提示端口8080占用escription: Web server failed to start. Port 8080 was already in use. Action: Identify and stop the process that’s listening on port 8080 or configure this application to listen on another port-优雅草卓伊凡解决方案
java spring 项目若依框架启动失败,启动不了服务提示端口8080占用escription: Web server failed to start. Port 8080 was already in use. Action: Identify and stop the process that’s listening on port 8080 or configure this application to listen on another port-优雅草卓伊凡解决方案
73 7
|
8天前
|
存储 监控 数据可视化
SaaS云计算技术的智慧工地源码,基于Java+Spring Cloud框架开发
智慧工地源码基于微服务+Java+Spring Cloud +UniApp +MySql架构,利用传感器、监控摄像头、AI、大数据等技术,实现施工现场的实时监测、数据分析与智能决策。平台涵盖人员、车辆、视频监控、施工质量、设备、环境和能耗管理七大维度,提供可视化管理、智能化报警、移动智能办公及分布计算存储等功能,全面提升工地的安全性、效率和质量。
|
14天前
|
人工智能 Java API
Java 也能快速搭建 AI 应用?一文带你玩转 Spring AI 可观测性
Java 也能快速搭建 AI 应用?一文带你玩转 Spring AI 可观测性
|
2月前
|
Java Spring
Java Spring Boot监听事件和处理事件
通过上述步骤,我们可以在Java Spring Boot应用中实现事件的发布和监听。事件驱动模型可以帮助我们实现组件间的松耦合,提升系统的可维护性和可扩展性。无论是处理业务逻辑还是系统事件,Spring Boot的事件机制都提供了强大的支持和灵活性。希望本文能为您的开发工作提供实用的指导和帮助。
119 15
|
3月前
|
设计模式 XML Java
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
本文详细介绍了Spring框架的核心功能,并通过手写自定义Spring框架的方式,深入理解了Spring的IOC(控制反转)和DI(依赖注入)功能,并且学会实际运用设计模式到真实开发中。
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
|
2月前
|
监控 JavaScript 数据可视化
建筑施工一体化信息管理平台源码,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
智慧工地云平台是专为建筑施工领域打造的一体化信息管理平台,利用大数据、云计算、物联网等技术,实现施工区域各系统数据汇总与可视化管理。平台涵盖人员、设备、物料、环境等关键因素的实时监控与数据分析,提供远程指挥、决策支持等功能,提升工作效率,促进产业信息化发展。系统由PC端、APP移动端及项目、监管、数据屏三大平台组成,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
114 7