工厂模式实现仓储模版

系统内部存在多种单据时仓储层必然要实现很多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;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值