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

1、业务需求

  OA系统中一般都会存在一个流程审批的需求,然而部门的千姿百态,引起需求的变幻无穷;所以须要在设计及开发过程当中,更多地、更好的设计程序,以即可方便扩展其功能。java

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

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

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

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

  类图:(暂缺)ide

3、代码实现及分析

  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. 流程性审批类spa

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型审批类code

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);
    }
}

4、总结

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

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

5、博问

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

相关文章
相关标签/搜索