1. 程式人生 > >工廠模式實現倉儲模版

工廠模式實現倉儲模版

系統內部存在多種單據時倉儲層必然要實現很多XXDAO,XXDO之類的,用工廠方法將所有的資料層介面統一封裝起來,可以讓倉儲層程式碼更具表達力,讓使用倉儲層的程式碼更簡潔清晰。

倉儲服務介面,對外暴漏基本增刪改查方法。

public interface OrderRepository {

    /**
     * insert order 
     * 
     * @param baseOrder order domain model
     */
    public void store(BaseOrder baseOrder);

    /**
     * update order
     * 
     * @param baseOrder order domain model
     */
    public void update(BaseOrder baseOrder);

    /**
     * load order by order id
     * 
     * @param serviceType service type
     * @param orderId order id
     * @return order domain model
     */
    public BaseOrder load(ServiceTypeEnum serviceType, String orderId);

    /**
     * lock and return order by order id
     * 
     * @param serviceType service type
     * @param orderId order id 
     * @return order domain model
     */
    public BaseOrder active(ServiceTypeEnum serviceType, String orderId);

}

倉儲工廠,內部維護服務型別和倉儲實現的對映,比如支付單使用支付單儲存實現,具體的支付單倉儲實現內部封裝了支付單DAO做sql執行.

public class OderRepositoryFactory implements OrderRepository {
    /** order repository map*/
    private static Map<ServiceTypeEnum, OrderRepository> orderRepositoryMap = new HashMap<ServiceTypeEnum, OrderRepository>();

    // init order repository map
    static {
        orderRepositoryMap.put(ServiceTypeEnum.PAY, new PayOrderRepository());
        orderRepositoryMap.put(ServiceTypeEnum.REFUND, new PayOrderRepository());
    }

    @Override
    public void store(BaseOrder baseOrder) {
        OrderRepository repository = getRepositoryByServiceType(baseOrder.getServiceType());
        repository.store(assetOrder);
    }

    @Override
    public void update(BaseOrder baseOrder) {
        OrderRepository repository = getRepositoryByServiceType(baseOrder.getServiceType());
        repository.update(assetOrder);
    }

    @Override
    public BaseOrder load(ServiceTypeEnum serviceType, String orderId) {
        OrderRepository repository = getRepositoryByServiceType(serviceType);
        return repository.load(orderId);
    }

    @Override
    public BaseOrder active(ServiceTypeEnum serviceType, String orderId) {
        OrderRepository repository = getRepositoryByServiceType(serviceType);
        return repository.active(orderId);
    }

    /**
     * find repository by service type
     * 
     * @param serviceType service type
     * @return order repository
     */
    private OrderRepository getRepositoryByServiceType(ServiceTypeEnum serviceType) {
        OrderRepository repository = orderRepositoryMap.get(serviceType);
        AssertUtil.assertNotNull(repository,
            String.format("Invalid serviceType[serviceType=%s].", serviceType.getCode()));
        return repository;
    }
}