工厂模式+策略模式实践
- 业务需求:根据传入的订单信息,不同类型的产品分别走不同的处理方式。
- 业务流程

- 技术设计:使用工厂模式+策略模式进行业务的处理

- 代码实现
- 测试调用
public class TestService{
public static void main(String[] args) {
//···处理前
//构造订单信息
ProductOrderInfo productOrderInfo = new ProductOrderInfo();
//根据产品类型在产品策略工厂获取策略
ProductStrategy productStrategy = ProductStrategyFactory.getProductStrategy(productOrderInfo.getProductType);
//通过产品策略构造产品处理器对象
ProductHandler productHandler = new ProductHandler(productStrategy);
//执行处理操作
productHandler.handler(productOrderInfo);
//···处理后
}
}
public class ProductOrderInfo {
//产品类型
private ProductType productType;
······
}
@Component
public class ProductStrategyFactory implements InitializingBean {
@Autowired
private List<ProductStrategy> productStrategies;
private static Map<ProductType, ProductStrategy> productStrategyMap;
@Override
//初始化bean的时候执行,将策略存入map当中
public void afterPropertiesSet() throws Exception {
productStrategyMap = productStrategies.stream().collect(Collectors
.toMap(ProductStrategy::getProductType, Function.identity()));
}
//根据产品类型获取对应的策略
public static ProductStrategy getProductStrategy(ProductType productType) {
if (productType == null ) {
throw new Exception("productType不能为空!");
}
return productStrategyMap.get(productType);
}
}
public interface InitializingBean {
//初始化bean的时候执行
void afterPropertiesSet() throws Exception;
}
public interface ProductStrategy {
/**
* 获取产品类型
* @return 产品类型
*/
ProductType getProductType();
/**
* 处理订单信息
* @param productOrderInfo 订单信息
* @return 处理结果
*/
boolean processProduct(ProductOrderInfo productOrderInfo);
@Component
public class AlphaProductStrategy implements ProductStrategy {
@Override
public ProductType getProductType() {
return ProductType.ALPHA;
}
@Override
public boolean processProduct(ProductOrderInfo productOrderInfo) {
//具体处理逻辑···
}
}
@Component
public class BetaProductStrategy implements ProductStrategy {
@Override
public ProductType getProductType() {
return ProductType.BETA;
}
@Override
public boolean processProduct(ProductOrderInfo productOrderInfo) {
//具体处理逻辑···
}
}
@Component
public class GammaProductStrategy implements ProductStrategy {
@Override
public ProductType getProductType() {
return ProductType.GAMMA;
}
@Override
public boolean processProduct(ProductOrderInfo productOrderInfo) {
//具体处理逻辑···
}
}
@Getter
public enum ProductType {
/**
* 产品类型1
*/
ALPHA(0, "α"),
/**
* 产品类型2
*/
BETA(1, "β"),
/**
* 产品类型3
*/
GAMMA(2, "γ");
private Integer code;
private String desc;
public class ProductHandler{
//产品策略
private ProductStrategy productStrategy;
public ProductHandler(ProductStrategy productStrategy){
this.productStrategy = productStrategy;
}
//处理方法
public Boolean handler(ProductOrderInfo productOrderInfo) {
//···处理前
boolean result = productStrategy.processProduct(productOrderInfo);
//···处理后
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。