工厂设计模式的思考

工厂模式对于开发者来说并不陌生,他利用多肽性很好的进行业务之间的解耦,不同的场景创建不同的实现,从而使得更多的关注业务实现,这种简单的实现这里不在举例。但是如果情形比较多的时候就会遇到问题,我们的工厂类就会产生大量的ifelse 进行判断,因此这时候就需要思考怎么样进行优化处理。

首先我结合平时的一个业务场景进行描述,简述下工厂设计模式。比如做一个秒批任务,接受来自第三方的服务,第三方申请成功后提交到系统,然后根据传入的事项进行校验个任务处理。真是情况,针对与不同的任务进行数据库动态配置进行处理,结合工厂模式进行设计实现,这里只描述工厂模式的应用。具体参考如下:

package com.szhome.study.factory;/*** @Author caizl* @Description 事项业务接口* @Date 2024/01/08/17:48* @Version 1.0*/
public interface IBussAdapter {public void check(String data);public String saveData(String data);
}package com.szhome.study.factory.impl;import com.szhome.study.factory.IBussAdapter;/*** @Author caizl* @Description 海域业务* @Date 2024/01/08/17:47* @Version 1.0*/
public class HyAdapter implements IBussAdapter {@Overridepublic void check(String data) {System.out.println("海域校验通过"+data);}@Overridepublic String saveData(String data) {System.out.println("海域办理通过" + data);return "ok";}
}package com.szhome.study.factory.impl;import com.szhome.study.factory.IBussAdapter;/*** @Author caizl* @Description 合同实现* @Date 2024/01/08/17:47* @Version 1.0*/
public class HtBussAdapter implements IBussAdapter {@Overridepublic void check(String data) {System.out.println("合同事项校验通过");}@Overridepublic String saveData(String data) {System.out.println("合同事项办理成功" + data);return "ok";}
}package com.szhome.study.factory;import com.szhome.study.util.ClassLoaderUtils;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;/*** @Author caizl* @Description TODO* @Date 2024/01/08/17:51* @Version 1.0*/
public class BussInvocationHandler implements InvocationHandler {//设置目标类public IBussAdapter iBussAdapter;public BussInvocationHandler(IBussAdapter iBussAdapter){this.iBussAdapter = iBussAdapter;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {Class<?>[] clazzByArgs = ClassLoaderUtils.getClazzByArgs(args);Method targetmethod = IBussAdapter.class.getMethod(method.getName(), clazzByArgs);return targetmethod.invoke(iBussAdapter,args);}
}package com.szhome.study.factory;import java.lang.reflect.Proxy;/*** @Author caizl* @Description TODO* @Date 2024/01/08/17:52* @Version 1.0*/
public class JDKBussProxy {public static <T> T getProxy(Class<T> interfaces , IBussAdapter iBussAdapter){BussInvocationHandler bussInvocationHandler = new BussInvocationHandler(iBussAdapter);ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();Class<?>[] interfaces1 = interfaces.getInterfaces();return (T)Proxy.newProxyInstance(contextClassLoader,new Class[]{interfaces1[0]},bussInvocationHandler);}
}
package com.szhome.study;/*** @Author caizl* @Description TODO* @Date 2024/01/08/20:35* @Version 1.0*/
public interface BussService {public void check(String data);public String saveData(String data);
}package com.szhome.study.impl;import com.szhome.study.BussService;/*** @Author caizl* @Description TODO* @Date 2024/01/08/20:35* @Version 1.0*/
public class BussServiceImpl implements BussService {@Overridepublic void check(String check) {System.out.println("随便的服务检查");}@Overridepublic String saveData(String check) {System.out.println("随便保存" + check);return "ok";}
}@Test
public void test_CacheService() throws Exception {//实现类通过配置进行创建BussService proxy = JDKBussProxy.getProxy(BussServiceImpl.class, new HtBussAdapter());proxy.check("123");String data = proxy.saveData("123");System.out.println("测试保存结果:" + data);}

通过接口编程,去除简单工厂的判断实现模式,采用统一接口服务,将统一接口服务创建代理工厂,通过传入的唯一表示创建实现类,从而动态的进行业务的解耦处理。

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

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

相关文章

Nacos与Eureka的区别详解

Nacos与Eureka的区别详解 在微服务架构中,服务注册与发现是核心组件之一,它们允许服务实例在启动时自动注册,并且能被其他服务发现,从而实现服务之间的互相通信。Nacos和Eureka都是现代微服务体系中广泛使用的服务注册与发现工具。本文将深入分析二者的区别,并为您提供一…

基于YOLOv7开发构建道路交通场景下CCTSDB2021交通标识检测识别系统

交通标志检测是交通标志识别系统中的一项重要任务。与其他国家的交通标志相比&#xff0c;中国的交通标志有其独特的特点。卷积神经网络&#xff08;CNN&#xff09;在计算机视觉任务中取得了突破性进展&#xff0c;在交通标志分类方面取得了巨大的成功。CCTSDB 数据集是由长沙…

OpenFeign超时控制

OpenFeign超时控制 前面简单介绍了Feign和OpenFeign的关系&#xff0c;言归正传&#xff0c;接下来我们看看OpenFeign如何设置调用超时&#xff0c;openFeign其实是有默认的超时时间的&#xff0c;默认分别是连接超时时间10秒、读超时时间60秒&#xff0c;源码在feign.Request…

Elasticsearch中object类型与nested类型以及数组之间的区别

一、区别&#xff1a; 0、一般情况下用object 类型来查es中为json对象的字段数据&#xff0c;用nested来查es中为JsonArray数组类型的字段数据。 1、默认情况下ES会把JSON对象直接映射为object类型&#xff0c;只有手动设置才会映射为nested类型 2、object类型可以直接使用普…

十九:爬虫最终篇-平安银行商城实战

平安银行商场实战 需求 获取该商城商品信息 目标网址 https://m.yqb.com/bank/product-item-50301196.html?mcId1583912328849970&loginModepab&historyy&sceneModem&traceid30187_4dXJVel1iop详细步骤 1、寻找数据接口 2、对比payload寻找可疑参数 3、多…

Day28 回溯算法part04 93. 复原IP地址 78. 子集 90. 子集 II

回溯算法part04 93. 复原IP地址 78. 子集 90. 子集 II 93. 复原 IP 地址 class Solution { private:vector<string> result;bool isValid(string& s,int start,int end){if (start > end) return false;if (s[start] 0 && start ! end) { // 0开头的数…

图像融合论文阅读:CrossFuse: 一种基于交叉注意机制的红外与可见光图像融合方法

article{li2024crossfuse, title{CrossFuse: A novel cross attention mechanism based infrared and visible image fusion approach}, author{Li, Hui and Wu, Xiao-Jun}, journal{Information Fusion}, volume{103}, pages{102147}, year{2024}, publisher{Elsevier} } 论文…

Yum(Yellowdog Updater Modified)命令大全详解

Yum&#xff08;Yellowdog Updater Modified&#xff09;是一个在基于RPM的Linux发行版上常用的包管理工具&#xff0c;主要用于自动安装、自动删除、自动升级软件包。下面列出了一些常见的Yum命令以及它们的解释&#xff1a; 安装软件包&#xff1a; yum install packageName…

当试图回复传入消息时,消息应用程序会闪烁

问题描述&#xff1a; Actual Results: Unable to reply for incoming message as Messaging app flickers and closes. Expected Results: User should be able to send reply for incoming messages. Reproduction Steps: Stay in home screen. Receive an incoming mes…

如何在 Ubuntu 20.04 上安装和使用 Docker

前些天发现了一个人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;最重要的屌图甚多&#xff0c;忍不住分享一下给大家。点击跳转到网站。 如何在 Ubuntu 20.04 上安装和使用 Docker 介绍 Docker是一个可以简化容器中应用程序进程管理过程的应用程序。…

拦截器HandlerInterceptor | springmvc系列

拦截器&#xff0c;通俗来来将&#xff0c;就是我们将访问某个路径的请求给拦截下来&#xff0c;然后可以对这个请求做一些操作 基本使用 创建拦截器类 让类实现HandlerInterceptor接口&#xff0c;重写接口中的三个方法。 Component //定义拦截器类&#xff0c;实现Handle…

如何编写kubernetes中使用的yaml文件?(基础概括版)

在操作kubernetes的过程中&#xff0c;我们经常接触到yaml文件&#xff0c;甚至有不少yaml文件超级长&#xff0c;就像在搭建集群的过程中&#xff0c;我们要用到的yaml文件&#xff0c;都是直接拷贝别人的&#xff0c;那这个yaml怎么解读&#xff1f;如果自己要写的话&#xf…

Python实现PowerPoint(PPT/PPTX)到PDF的批量转换

演示文稿是一种常见传达信息、展示观点和分享内容的形式&#xff0c;特别是PowerPoint演示文稿&#xff0c;广泛应用于各行各业&#xff0c;几乎是演讲等场合的必备工具。然而&#xff0c;演示文稿也有其限制&#xff0c;对设备的要求较高&#xff0c;且使用不同的软件或设备演…

uView route 路由跳转

route(Object) 此为一个路由跳转方法&#xff0c;内部是对uni多个路由跳转api的封装&#xff0c;更方便使用 Object参数说明&#xff1a; 参数名类型默认值是否必填说明typeStringnavigateTofalsenavigateTo或to对应uni.navigateTo&#xff0c;redirect或redirectTo对应uni.…

Ubuntu下AI4Green开源ELN服务的简单部署

主部署程序&#xff1a;AI4Green 配置参考这篇文档&#xff1a;AI4Green开源ELN&#xff08;电子实验记录本&#xff09;-CSDN博客 流量转发和负载均衡&#xff1a;使用Nginx 配置参考这篇文档&#xff1a;Nginx负载均衡-CSDN博客 SSL配置部分参考这篇文档&#xff1a; 设置…

SpringBoot-开启Actuator监控

Spring Boot Actuator是Spring Boot提供的一种管理和监控应用程序的框架&#xff0c;可以帮助我们了解应用程序的运行状况&#xff0c;提供HTTP端点来暴露应用程序的不同方面&#xff0c;如健康状况、指标、日志和运行时信息等。 开启Actuator监控&#xff0c;我们可以通过HTT…

Hyperledger Fabric 核心概念与组件

要理解超级账本 Fabric 的设计&#xff0c;首先要掌握其最基本的核心概念与组件&#xff0c;如节点、交易、排序、共识、通道等。 弄清楚这些核心组件的功能&#xff0c;就可以准确把握 Fabric 的底层运行原理&#xff0c;深入理解其在架构上的设计初衷。知其然&#xff0c;进…

回顾2023编程之旅

一、前言 看在给了我一个博客专家的份上就继续写写博客&#xff0c;实事求是的讲如果是工作之余去总结csdn写写技术博客&#xff0c;还想混个专家什么的&#xff0c;真的是精力不够。因为里面的灌水的实在太多&#xff0c;比不过的&#xff0c;写这个玩意必须得淡泊名利才能悠然…

【车载以太网测试从入门到精通】——DoIP协议测试

系列文章目录 【车载以太网测试从入门到精通】系列文章目录汇总 文章目录 系列文章目录一、DoIP首部否定响应测试1.0x00格式错误2.0x01未知的负载类型3.0x02报文过长4.0x03超出内存5.0x04无效的负载长度二、车辆识别测试1.车辆声明2.车辆识别请求3.带EID的车辆识别请求4.带VIN…

部署一款开源的交互审计系统—Next Terminal

博客地址 部署一款开源的交互审计系统—Next Terminal-雪饼 (xue6ing.cn)https://xue6ing.cn/archives/bu-shu-yi-kuan-kai-yuan-de-jiao-hu-shen-ji-xi-tong--next-terminal Next Terminal是什么&#xff1f; Next Terminal是一个开源的交互审计系统&#xff0c;具有以下主…