首页 > 其他分享 >SpringBoot中工厂模式使用

SpringBoot中工厂模式使用

时间:2023-03-04 21:47:04浏览次数:45  
标签:SpringBoot void 模式 工厂 class controller doStep public

 

工厂模式本质是让对获取对象过程的抽象

现有如下需求,根据输入类型,将数据存到Mongo还是Oracle,如下两个实例分别不使用工厂与使用工厂模式的比较

 

1. 不使用工厂模式

 如下实例中,根据controller层输入type不同类型,需要hardcode加if...else..逻辑来判断执行哪个service。而且在controller层需要注入这两个service,以后如果还要存sqlserver需要改controller显得代码耦合性很高

Contorller:
@RestController
@RequestMapping
public class Controller {
    @Autowired
    @Qualifier("step1")
    private IStoreData iStoreData1;

    @Autowired
    @Qualifier("step2")
    private IStoreData iStoreData2;

    @RequestMapping("login")
    public void test(String type){
        if(StringUtils.equalsIgnoreCase(type,"step1")){
            iStoreData1.doStep();
        } else if(StringUtils.equalsIgnoreCase(type,"step2")){
            iStoreData2.doStep();
        }
    }
}

Interface:
public interface IStoreData {
    public void doStep();
}

Service1:
@Service
public class StoreDataInMongo implements IStoreData {
    public void doStep(){
        System.out.println("store data in Mongo");
    }
}

Service2:
@Service
public class StoreDataInOracle implements IStoreData {
    public void doStep(){
        System.out.println("store data in Oracle");
    }
}
View Code

 

 

2. 使用工厂模式 -- iStepMap来获取相应service

如下例中,采用工厂模式,以后如果新增其他类型service可以不用改controller、工厂类以及Interface。只需要新增一个service即可。降低代码见耦合度。

另外使用工厂模式将被调用实例(storeService)创建交给工厂类来完成

controller:
@RestController
@RequestMapping
public class FController {

    @Autowired
    private FactoryService fService;  //controller层只需要注入工厂类,如果后续需往sqlserver存数据,只需要新增一个sqlserver存数据的service即可,工厂类、controller不需要该任何内容。实现代码解耦

    @RequestMapping("factory")
    public void test(String type){
        IFStoreData step= fService.getStep(type);
        step.doStep();
    }
}

Interface:
public interface IFStoreData {
    public void doStep();
}

Service1:
@Service
public class FStoreDataInMongo implements IFStoreData {
    public void doStep(){
        System.out.println("store data in Mongo");
    }
}

Service2:
@Service
public class FStoreDataInOracle implements IFStoreData {
    public void doStep(){
        System.out.println("store data in Oracle");
    }
}

FactoryService(工厂类):
public class FactoryService{
  /*
  FStoreInMongo,FStoreInOracle都有@Service注解,Springboot启动会被自动扫描;
  同时定义一个Map,将bean注入到map中,key为bean名字(注意key会将类名自动变为小写,如果想指定名称,可以使用@Service("XXX")),value为对象实例
  */
@Autowired private Map<String, IFStoreData> iStepMap=new ConcurrentHashMap<>(); public IFStoreData getStep(String key){ return iStepMap.get(key); } }

 

标签:SpringBoot,void,模式,工厂,class,controller,doStep,public
From: https://www.cnblogs.com/enhance/p/17179163.html

相关文章

  • SpringBoot 项目集成 knife4j
    文档地址:https://doc.xiaominfo.com/knife4j是为JavaMVC框架集成Swagger生成\(Api\)文档的增强解决方案。Swagger介绍前后端分离开发模式中,api文档是最好的沟通......
  • SpringBoot开发实用-测试
    ​ 测试。测试是保障程序正确性的唯一屏障,在企业级开发中更是不可缺少,但是由于测试代码往往不产生实际效益,所以一些小型公司并不是很关注,导致一些开发者从小型公司进入中......
  • SpringBoot开发实用-配置
    2.配置高级​ 进入开发实用篇第二章内容,配置高级,其实配置在基础篇讲了一部分,在运维实用篇讲了一部分,这里还要讲,讲的东西有什么区别呢?距离开发过程越来越接近,解决的问题也......
  • Activity的四种启动模式详解
    Activity的启动模式1.启动模式的类别标准模式(standard)栈顶复用模式(singleTop)栈内复用模式(singleTask)单例模式(singleInstance)2.任务栈任务栈Task,是一种用来放置......
  • X86平台:多任务操作系统在X86保护模式下两种内存模型下的工作模式及其设计
        本文于2023/3/2,开始写作,因为内容太多了,所以暂时只能拟出标题,我可以根据这个标题进行复习,学习过相关知识的同学也可以根据题目复习。    自学了李忠老......
  • docker搭建maven私服(nexus3),整合springboot上传下载依赖
    一、前言我们在JavaWeb开发中必不可少的就是jar包管理-maven,在没有maven之前,都是自己手动下载jar包导入到项目中,非常的繁琐。maven出现之后,又迎来新的问题,对于仓库里人家......
  • MacBook里从微信上下载文件后打开,都显示的只读模式,怎么解决?
    yds@ydsdeAir~%sudochmod-R755/Users/yds/Library/Containers/com.tencent.xinWeChat/Data/Library/Application\Support/com.tencent.xinWeChat/可以修改微信文......
  • 设计模式篇之一文搞懂如何实现单例模式
    设计模式篇之一文搞懂如何实现单例模式大家好,我是小简,这一篇文章,6种单例方法一网打尽,虽然单例模式很简单,但是也是设计模式入门基础,我也来详细讲讲。DEMO仓库:https://gi......
  • 如何判断大端小端模式
    这是一篇介绍计算机大端模式和小端模式的博客,主要介绍了大小端方式的区别,各自的优缺点,以及如何利用代码进行简单判断。一、来源与定义1、来源大端小端名词取自于《格列......
  • CSS@media暗黑模式配置
    css媒体切换需要基于模板修改成需要的样式@media(prefers-color-scheme:light){.article{background:#fff;color:#000;}}@media(pr......