設計模式——工廠模式實例

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

相關文章
相關標籤/搜索