设计模式 总目录
https://preparedata.blog.csdn.net/article/details/134512591
文章目录
一、案例
在的下单业务中,对于不同的类型的商品(鞋子、帽子),需要处理的下单业务,可能存在部分相同,部分不同
这时候可以利用简单工厂模式,依据不同的商品类型,调用不同的处理器,进行下单
1.定义 抽象类 AbstractOrder
定义声明下单方法, 实现公共下单逻辑; 提供获取对应商品类型的实例 HatOrder(帽子业务)
、 ShoeOrder(鞋子业务)
2.定义 实现类 HatOrder(帽子)
、 ShoeOrder(鞋子)
继承AbstractOrder, 实现下单逻辑, 同时也可以调用父级AbstractOrder的公共方法
抽象类是一种特殊的接口
当商品类型更多的时候,添加实现类, 继承AbstractOrder,能够利用拆分不同的下单业务,约束接口, 抽取公共方法,统一参数等
个人理解,简单工厂目的在于业务执行器的选择,也就是if else 的升级版,比if else能够更好的解耦,也能约束后来开发人员的代码书写规范。
对于if else中嵌套if else,可以参考复杂工厂模式
二、抽象类 (订单抽象类)
java
package com.pd.shopping.order.designPattern.factory;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.util.Map;
/**
* @author hll
*/
@Slf4j
@Component
public abstract class AbstractOrder {
public static AbstractOrder getInstance(String orderType) {
switch (orderType){
case "shoe":
//可以利用一些获取Bean的工具获取, 避免new
//SpringApplicationUtil.getBean(ShoeOrder.class);
return new ShoeOrder();
case "hat":
return new HatOrder();
default:
return null;
}
}
/**
* 创建订单
* @param map
*/
public abstract void create(Map<String,Object> map);
/**
* 查询
* @param map
*/
public abstract void query(Map<String,Object> map);
/**
* 公共方法
*/
public void common(){
log.debug("调用公共方法");
}
}
三、实现类
3.1 帽子订单
java
package com.pd.shopping.order.designPattern.factory;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.util.Map;
/**
* @author hll
*/
@Slf4j
@Component
public class HatOrder extends AbstractOrder{
/**
* 创建订单
* @param map
*/
@Override
public void create(Map<String,Object> map){
super.common();
log.debug("创建帽子订单");
}
/**
* 查询
* @param map
*/
@Override
public void query(Map<String,Object> map){
super.common();
log.debug("创建帽子订单");
}
}
3.2 鞋子订单
java
package com.pd.shopping.order.designPattern.factory;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.util.Map;
/**
* @author hll
*/
@Slf4j
@Component
public class ShoeOrder extends AbstractOrder{
/**
* 创建订单
* @param map
*/
@Override
public void create(Map<String,Object> map){
super.common();
log.debug("创建鞋子订单");
}
/**
* 查询
* @param map
*/
@Override
public void query(Map<String,Object> map){
super.common();
log.debug("查询鞋子订单");
}
}
四、调用
java
@GetMapping("/factoryOrder")
public void factoryOrder() {
AbstractOrder.getInstance("shoe").create(new HashMap<>());
AbstractOrder.getInstance("hat").query(new HashMap<>());
}