设计模式——工厂模式实例
一、业务需求
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...的。
出处: http://www.cnblogs.com/maoan/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。