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

一、业务需求

  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...的。

原文地址:https://www.cnblogs.com/maoan/p/3348788.html