springboot中的工厂模式

news2024/9/22 19:44:35

说到工厂模式,先说说工厂模式是什么,有什么优点

平常我们在工作开发过程中,往往因为工期问题导致整体功能设计考虑的不够周到,导致后期迭代时发现需要原有功能流程基础上追加新功能时,需要耗费更多的成本,无法轻易推翻重构,接着便是将错就错,在if else之下再来一层elseif。通过设计模式去优化代码,达到代码的复用性,减少耦合,也就是我们常说的高内聚低耦合。

通过工厂模式可以把对象的创建和使用过程分割开来。比如说 Class A 想调用 Class B的方法,那么我们无需关心B是如何创建的,直接去工厂获取就行

那我们直接上代码举例一二:

代码结构:

工厂类:
@Component
public class ConnectionFactory implements ApplicationContextAware {
 
    public static Map<String, IConnectionService> connectionMap = new HashMap<String, IConnectionService>();
 
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        //根据接口类型返回相应的所有bean
        Map<String, IConnectionService> map = applicationContext.getBeansOfType(IConnectionService.class);
        for (Map.Entry<String, IConnectionService> data : map.entrySet()) {
            List<String> typeList = data.getValue().getType();
            if (CollUtil.isNotEmpty(typeList)) {
                for (String type : typeList) {
                    connectionMap.put(type, data.getValue());
                }
            }
        }
 
    }
 
    public static IConnectionService getConnectionService(String type) {
        IConnectionService connectionService = connectionMap.get(type);
        if (ObjectUtil.isNotNull(connectionService)) {
            return connectionService;
        } else {
            return null;
        }
    }
 
 
}
接口: 
public interface IConnectionService {
    
    Integer checkConnection(Connection connection);
    //获取类型
    List<String> getType();
 
}

实现类一:

@Slf4j
@Service
public class JdbcConnectionServiceImpl implements IConnectionService {
 
    @Override
    public Integer checkConnection(Connection connection) {
        int res = 0;
        return res;
    }
 
    @Override
    public List<String> getType() {
        List<String> typeList = new ArrayList<>();
        typeList.add(PublicConstant.DATA_SOURCE_TYPE.MYSQL_TYPE);
        return typeList;
    }
}
调取:
@RequestMapping(value = "/checkConnection", method = RequestMethod.POST)
    @ResponseBody
    public String checkConnection(@RequestBody Connection connection) {
        if(StringUtils.isEmpty(connection.getDataSourceType())){
            return ReturnMapUtils.setFailedMsgRtnJsonStr("请传入数据源类型");
        }
        Integer integer = 0;
        //获取对应的Service对象
        IConnectionService service = ConnectionFactory.getConnectionService(connection.getDataSourceType());
        //检查连接是否成功
        if (ObjectUtil.isNotNull(service)) {
            integer = service.checkConnection(connection);
        }
        if (integer.equals(0)) {
            return ReturnMapUtils.setFailedMsgRtnJsonStr("连接失败");
        } else {
            return ReturnMapUtils.setSucceededMsgRtnJsonStr("连接成功");
        }
    }

=====================================================================

实现方式二:

//工厂类
import java.util.Map;
import com.google.common.collect.Maps;
 
public class TypeCheckFactory {
    private static Map<String, TypeCheck> strategyMap = Maps.newHashMap();
 
    public static TypeCheck getInvokeStrategy(String name) {
 
        return strategyMap.get(name);
    }
 
    public static void register(String name, TypeCheck stopCheck) {
        if (StringUtils.isEmpty(name) || stopCheck == null) {
            return;
        }
        strategyMap.put(name, stopCheck);
    }
 
    public static Map<String, TypeCheck> getStrategyMap() {
        return strategyMap;
    }
}

 //实现类:
@Component
public class LSHAnalysisSimilerType implements StopCheck {
 
 
    @Override
    public String doInformationVerification() {
        return null;
    }
 
    @Override
    public String doInformationVerification(CheckFactoryBean checkFactoryBean) {
 
        return null;
    }
 
 
    //这个方法很关键,自动注入的关键,将当前对象注入进去当一个类实现这个接口之后,Spring启动时,初始化Bean时,若该Bean实现InitializingBean接口,则会自动调用afterPropertiesSet()方法,完成一些用户自定义的初始化操作
    @Override
    public void afterPropertiesSet() throws Exception {
        StopCheckFactory.register("LSHAnalysisSimilerType", this);
    }
}
//调取:
public static String typeMetaInformation(List<TypeVo> parentStopsVos, TypeVo toStopsVo,boolean checkFlag){
        String categories = getTypeCheckCategories(toStopsVo);
        TypeCheck typeCheck = StopCheckFactory.getInvokeStrategy(categories);        
        return typeCheck.doInformationVerification("123");
    }

转载链接:https://blog.csdn.net/Alex_81D/article/details/123797391?spm=1001.2014.3001.5506

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

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

相关文章

【HarmonyOS NEXT星河版开发学习】小型测试案例16-小米官网轮播图部分

个人主页→VON 收录专栏→鸿蒙开发小型案例总结​​​​​ 基础语法部分会发布于github 和 gitee上面&#xff08;暂未发布&#xff09; 前言 鸿蒙开发中的Swiper组件应用十分的广泛&#xff0c;像小米、淘宝、京东...众多网友都采用了轮播图的效果。不仅更加的美观&#xff0c…

AutoTiny电脑自动化操作

AutoTiny 可以自动化电脑上的一些操作&#xff0c;比如帮你重复鼠标点击操作&#xff08;我猜可以当作外挂刷怪&#xff0c;可惜已经过了喜欢刷怪的年纪了&#xff09;

Linux学习之路 -- 进程 -- 进程间通信 -- 管道通信

本文主要介绍进程通信中的管道通信。 前面我们学习进程的过程中&#xff0c;我们知道&#xff0c;进程是具有独立性的。这也就导致了进程不能够直接地把数据进行传递。为了实现进程之间地通信&#xff0c;我们就需要通过另外地方式来实现进程之间数据地传递。 1.进程通信的目…

训练 Transfomer 模型的内存消耗计算

目录 model 内存gradients 内存activates 内存 经典图打底&#xff1a; 训练深度模型的内存消耗主要有以下几个部分&#xff1a; 存储模型可训练参数存储梯度存储反向传播中间变量&#xff0c;例如&#xff1a; L ( Y − Y ^ ) 2 Y ^ X T W ∂ L ∂ W − 2 ( Y − Y ^ ) …

Transformer架构;Encoder-Decoder;Padding Mask;Sequence Mask;

目录 Transformer架构 Transformer架构的主要组成部分: 简单举例说明输入和输出: Encoder-Decoder 编码器/解码器组成 6、位置前馈网络(Position-wise Feed-Forward Networks) 7、残差连接和层归一化 10、掩码Mask 10.1 Padding Mask 10.2 Sequence Mask 为什么…

Gradio 复杂布局的实现

Gradio Interface 和 ChatInterface 布局都相对固定&#xff0c;只能通过参数添加组件&#xff0c;如果想要自定义页面布局&#xff0c;就需要更高级的布局方式 Block 。Gradio 中可以通过行和列进行布局&#xff0c;可以互相嵌套。我们先看一官方的例子&#xff1a; import g…

Vue Mixins 深度解析含面试常问题

Vue Mixins 深度解析含面试常问题 文章目录 Vue Mixins 深度解析含面试常问题一、Mixin 是什么二、Vue中如何使用1. 创建Mixin2. 使用Mixin3. 合并策略4. 全局Mixin5. 使用场景 三、包含哪些属性或方法API四、扩展与高级技巧1. 命名冲突2. 全局 vs 局部3. 合并策略深入4. 使用高…

商品期权会爆仓吗?

商品期权交易中存在爆仓的情况。一个期权的价格与其基础资产的波动性密切相关。在波动性高的情况下&#xff0c;尽管收益可能更高&#xff0c;但投资者也需要面对更大的价格波动风险&#xff0c;商品期权有买方和卖方&#xff0c;买方无爆仓风险&#xff0c;卖方是保证金交易有…

Hadoop大数据集群搭建

一、虚拟机配置网络 1、配置文件 进入“/etc/sysconfig/network-scripts”目录&#xff0c;查看当前目录下的“ifcfg-ens33”文件 对“ens33”文件进行配置 2、重启网络 systemctl restart network 3、测试网络 Ping www.baidu.com 4、设置虚拟机主机名称 5、绑定主机名和…

【android 9】【input】【11.发送普通motion事件1——touch设备的加载——MultiTouchInputMapper】

系列文章目录 可跳转到下面链接查看下表所有内容https://blog.csdn.net/handsomethefirst/article/details/138226266?spm1001.2014.3001.5501文章浏览阅读2次。系列文章大全https://blog.csdn.net/handsomethefirst/article/details/138226266?spm1001.2014.3001.5501 目录 …

传知代码-CENet及多模态情感计算实战(论文复现)

代码以及视频讲解 本文所涉及所有资源均在传知代码平台可获取 一、概述 本文对 “Cross-Modal Enhancement Network for Multimodal Sentiment Analysis” 论文进行讲解和手把手复现教学&#xff0c;解决当下热门的多模态情感计算问题&#xff0c;并展示在MOSI和MOSEI两个数…

labview经验分享1-任意16进制字符类型匹配

系列文章目录 1、任意16进制字符类型匹配 文章目录 系列文章目录问题导入实现任意16进制字符类型匹配在这里插入图片描述 总结 问题导入 labveiw的字符串匹配&#xff0c;使用的是正则表达式&#xff0c;可以让我们很方便的对字符串进行字符处理操作。 但是某些情况下&#…

WEB渗透Bypass篇-常规操作

绕过lsa-protection https://github.com/RedCursorSecurityConsulting/PPLKillerLinux绕过disable_function LD_PRELOAD linux环境 putenv()、mail()可用 https://github.com/yangyangwithgnu/bypass_disablefunc_via_LD_PRELOAD http://192.168.0.107/bypass_disablefunc.p…

一篇文章教你搭建一个高深莫测的SQL优化器

❓在数据库操作中&#xff0c;SQL优化一直是一个让人头疼的问题。今天&#xff0c;我将教你一种无需编写任何代码&#xff0c;只需要两个组件&#xff0c;便能轻松搭建一个高深莫测的SQL优化器的方法。通过这个方法&#xff0c;它可以将巨慢无比的SQL&#xff0c;把速度优化到极…

重启人生计划-浮舟沧海

&#x1f973;&#x1f973;&#x1f973; 茫茫人海千千万万&#xff0c;感谢这一刻你看到了我的文章&#xff0c;感谢观赏&#xff0c;大家好呀&#xff0c;我是最爱吃鱼罐头&#xff0c;大家可以叫鱼罐头呦~&#x1f973;&#x1f973;&#x1f973; 如果你觉得这个【重启人生…

VIM复合命令

VIM提供了很多 复合命令&#xff0c;可以把两个动作合并为一次按键。极大提高了编辑效率。以下是一些具体的例子&#xff1a; 复合命令等效的长命令说明Cc$删除光标到行尾scl删除光标位置的字符S^C删除整行I^i光标移动到行首A$a光标移动到行尾oA 回车光标下方开启一行Oko光标…

一文掌握SOP搭建步骤方法

如果你正在阅读这篇文章&#xff0c;那么你很可能在寻找如何为你的企业编写标准操作程序&#xff08;SOP&#xff09;的指导&#xff0c;以确保更好的流程被传达给你的团队并且得到遵循。 为什么SOPs很重要 SOPs必须清晰地传达你的业务流程&#xff0c;以标准化操作并确保盈利性…

Vue2 消息订阅与发布

1.pubsub-js 第三方库实现 实现任何框架的消息订阅发布 npm i pubsub-js <template><div class"student"><h2>展示学生的名称:{{ name }}</h2><h2>展示学生的性别:{{ sex }}</h2></div> </template><script>…

浏览器插件利器--allWebPluginV2.0.0.16-Stable版发布

allWebPlugin简介 allWebPlugin中间件是一款为用户提供安全、可靠、便捷的浏览器插件服务的中间件产品&#xff0c;致力于将浏览器插件重新应用到所有浏览器。它将现有ActiveX控件直接嵌入浏览器&#xff0c;实现插件加载、界面显示、接口调用、事件回调等。支持Chrome、Firefo…

ollama使用llama3.1案例

ollama安装和运行llama3.1 8b conda create -n ollama python3.11 -y conda activate ollama curl -fsSL https://ollama.com/install.sh | sh ollama run songfy/llama3.1:8b 就这么简单就能运行起来了. 我们可以在命令行中与他交互. 当然我们也可以用接口访问: curl http:…