工厂模式初体验

2020-04-22  本文已影响0人  simperLv

由于需要判断业务找到对应的实现类,又不想写太多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);
    }

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

途中遇到的问题

 private xxService xxService;
    @Autowired
    public EnterController(xxService xxService) {
        //参数构造方法
        this.xxService = xxService;
    }

    public EnterController() {
        //无参构造方法
    }

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

上一篇下一篇

猜你喜欢

热点阅读