工廠模式實現倉儲模版
系統內部存在多種單據時倉儲層必然要實現很多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;
}
}