• 设计模式——工厂模式实例


    一、业务需求

      OA系统中通常都会存在一个流程审批的需求,然而部门的千姿百态,引发需求的千变万化;因此需要在设计及开发过程中,更多地、更好的设计程序,以便可方便扩展其功能。

      在做项目的过程中,客户提出这样一个需求:OA系统中对于业务流程的审批可分为:流程性审批、非流程性审批还有其他审批,流程性审批又包括流程A审批,流程B审批......非流程性和其他审批也类似【如下图所示】,最终返回的结果当前业务流程所在节点的状态信息。

      由于我对设计模式并不熟悉,了解的东西顶多也就只会纸上谈兵,吹吹水罢了。终于到了实战了,拿到需求后,前前后后在E-R图、功能设计上花了将近半个钟,于是采用工厂模式来完成对这个需求的实现。

    二、工厂模式(简单工厂模式)

      定义:简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Factory Method)模式。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例

      类图:(暂缺)

    三、代码实现及分析

      1. 业务审批接口类

     1 package com.swyma.approval.core;
     2 
     3 /**
     4  * 查询状态接口
     5  * @author yemaoan
     6  *
     7  */
     8 public interface IApprovalService {
     9     
    10     public String getCurrnetStauts(String type);
    11 }

      2. 流程性审批类

    package com.swyma.approval.service;
    
    import com.swyma.approval.core.IApprovalService;
    import com.swyma.approval.core.VirutalValue;
    
    /**
     * 流程性审批
     * @author yemaoan
     *
     */
    public abstract class FlowApprovalService implements IApprovalService{
    
        public Long getInstantId(String type) {
            
            VirutalValue value = new VirutalValue();    //模拟数据
            
            return value.getValue(type);
        }
    
    }

        2.1 流程性A型审批类

    package com.swyma.approval.service;
    
    /**
     * 流程性审批-->审批A
     * @author yemaoan
     *
     */
    public class DelegateApprovalService extends FlowApprovalService {
    
        public String getCurrnetStauts(String type) {
    
            Long ident = super.getInstantId(type);
    //        System.out.println(ident);
            //通过ident查找该流程所在节点的状态
            //...
            return "主管审核";
        }
    
    }

        2.2 流程性B型审批类

    package com.swyma.approval.service;
    
    /**
     * 流程性审批-->审批B
     * @author yemaoan
     *
     */
    public class PlanApprovalService extends FlowApprovalService {
    
        public String getCurrnetStauts(String type) {
            
            Long ident = super.getInstantId(type);
            //通过ident去查找该流程状态
            //...
            return "经理审核";
        }
    
    }

      3. 非流程性审批类

    package com.swyma.approval.service;
    
    import com.swyma.approval.core.IApprovalService;
    
    /**
     * 非流程性审批
     * @author yemaoan
     *
     */
    public class NotFlowApprovalService implements IApprovalService{
    
        public String getCurrnetStauts(String type) {
            return "审核中...";
        }
    
    }

      4. 其它审批类

    package com.swyma.approval.service;
    
    import com.swyma.approval.core.IApprovalService;
    
    /**
     * 其他方式审批
     * @author yemaoan
     *
     */
    public class OtherApprovalService implements IApprovalService {
    
        public String getCurrnetStauts(String type) {
            return "审核通过";
        }
    
    }

      5. 其他辅助类【模拟数据等】

        5.1 模拟数据

    package com.swyma.approval.core;
    
    import java.util.HashMap;
    import java.util.Map;
    
    /**
     * 模拟数据
     * @author yemaoan
     *
     */
    public class VirutalValue {
    
        private Map<String, Long> valueMap = new HashMap<String, Long>();
        
        public VirutalValue() {
            valueMap.put("a", 1l);
            valueMap.put("b", 2l);
            valueMap.put("c", 3l);
            valueMap.put("d", 4l);
        }
        
        public Long getValue(String key) {
            return valueMap.get(key);
        }
        
        public void setValue(String key, Long value) {
            valueMap.put(key, value);
        }
    }

        5.2 实例类信息

    package com.swyma.approval.core;
    
    import java.util.HashMap;
    import java.util.Map;
    
    import com.swyma.approval.service.DelegateApprovalService;
    import com.swyma.approval.service.NotFlowApprovalService;
    import com.swyma.approval.service.OtherApprovalService;
    import com.swyma.approval.service.PlanApprovalService;
    
    /**
     * 实例化信息
     * @author yemaoan
     *
     */
    public class ApprovalMap {
    
        private Map<String, Class> approvalMap = new HashMap<String, Class>();
        
        public ApprovalMap() {
    
            approvalMap.put("a1", DelegateApprovalService.class);
            approvalMap.put("a2", PlanApprovalService.class);
            approvalMap.put("b", NotFlowApprovalService.class);
            approvalMap.put("c", OtherApprovalService.class);
        }
        
        public Class getApproval(String key) {
            return approvalMap.get(key);
        }
    }

    四、总结

      1. 从设计上看,基本上还是符合了客户的需求,可以比较好的解决扩展方面的问题。增加新一个审批流程时,只需要在加多一个实例化,并在Approval加多一个映射值;

      2. 此次也是第一次在实际项目中运用到设计模式,有收获的同时也多少有一些盲点,我也将在以后的学习编程中,不断地寻求解决方案。

    五、博问

      1. 有没有更好的方法或者模式可以替代Approval这个类?这个类我在设计的过程中是想避开if...else...的。

  • 相关阅读:
    Button 的CommandName 用法
    如何循序渐进向DotNet架构师发展
    用sqlserver进行分布式查询(链接服务器)(转)
    关于.resx
    OO设计原则总结
    为ASP.NET 2.0网站生成唯一程序集
    依赖倒置、控制反转和依赖注入辨析(转)
    通过http地址获取页面内容
    Sql同表去除重复
    动态启动WCF服务
  • 原文地址:https://www.cnblogs.com/maoan/p/3348788.html
Copyright © 2020-2023  润新知