美文网首页
工厂模式初体验

工厂模式初体验

作者: simperLv | 来源:发表于2020-04-22 17:29 被阅读0次

    由于需要判断业务找到对应的实现类,又不想写太多if else,然后参考了这篇文章https://www.cnblogs.com/davidwang456/p/10831546.html
    就测试了一下简单工厂模式,把心路历程记一下。有些涉及业务具体实现的就省略了

    业务场景

    该项目就是一个web项目,这里的业务简单概括为,前端传来 表名,id等信息,通过表名去找到对应业务的实现方法

    接口类

    public interface Operation {
      //编辑
        String declareInfo(param1,param2,XXService xxService);
        //撤回
        String rollback(param1, XXService xxService);
      //删除
        String delDeclare(param);
    }
    

    评审业务实现

    @Service
    public class Assess implements Operation {
    
        @Override
        public String declareInfo(param1,param2,xxService xxService) {
                    //do sth
                   return new AssessController(xxService).editAssess(request);
        }
    
        @Override
        public String rollback(param1, XXService xxService) {
             //do sth
            return new AssessController(xxService).rollBackPerson();
        }
    
        @Override
        public String delDeclare(param) {
             //do sth
            return new AssessController().delAssessInfo();
        }
    }
    

    考试申报业务实现

    @Service
    public class Exam implements Operation {
        @Override
        public String declareInfo(param1,param2,XXService xxService) {
            //do sth
            return new EnterController(enterService).appraisalDeclare(request);
        }
    
        @Override
        public String rollback(param1, XXService xxService) {
                    //do sth
                   return new EnterController(enterService).rollBackPerson();
        }
    
        @Override
        public String delDeclare(param) {
            //do sth
            return new EnterController().delEnterInfo();
        }
    }
    

    后面其他业务实现就直接省略了,差的只是业务不同而已

    工厂类

    public class OperatorFactory {
        static Map<String, Operation> operationMap = new HashMap<>();
        static {
            //考试报名
            operationMap.put("表名1", new Exam());
            //评审报名
            operationMap.put("表名2", new Assess());
            //职务认定
            operationMap.put("表名3", new Believe());
            //证书补办
            operationMap.put("表名4", new Certificate());
        }
    
        public static Optional<Operation> getOperation(String operation) {
            return Optional.ofNullable(operationMap.get(operation));
        }
    }
    

    控制层(前端访问地址)

    @RequestMapping({"editDeclare.do"})
        public String editDeclare(HttpServletRequest request){
            //参数获取
            Operation targetOperation = OperatorFactory
                    .getOperation(dto.getAsString("tableName"))
                    .orElseThrow(() -> new IllegalArgumentException("没找到申报类型"));
            return targetOperation.declareInfo(request,dto,enterService);
        }
    

    剩下两种业务也只是调用接口方法不同

    途中遇到的问题

    • 该项目为前端工程(也不算前端项目吧,有点微服务的意思),业务处理直接在控制层去调用其他业务工程的接口实现,这边之前图省事加了一个service。
      在实现类调用控制层时,因为也没有把Controller注册到Bean容器,所以也没发在实现类去加注解添加实例,然后我就直接new的,但是这样的话 控制层中的service也就没有取到,然后我直接在前端调用的控制层那里获取service再通过参数传过去。
      然后把用到的控制层的依赖注入由接口注入改为构造器注入
     private xxService xxService;
        @Autowired
        public EnterController(xxService xxService) {
            //参数构造方法
            this.xxService = xxService;
        }
    
        public EnterController() {
            //无参构造方法
        }
    

    虽然问题解决了,但是总感觉怪怪的....
    然后又深入了解了一下工厂模式,后续有时间再改吧!现在理解还不透彻,先把任务提交一下,免得领导问。

    相关文章

      网友评论

          本文标题:工厂模式初体验

          本文链接:https://www.haomeiwen.com/subject/adabihtx.html