什么场景下使用?
- 同一功能下多个接口返回格式不同
- 同一功能下多个接口传入参数不同
- 同一功能下业务可能会有同级接口拓展
一句话总结
定义一个创建对象的接口,让其子类自己决定要实例化那个一个工厂类。
优点
屏蔽功能的具体实现细节,外部只是调用就行
缺点
实现类多,不易后期维护
具体实现
代码结构
步骤(个人习惯,先定义接口)
- 定义同一接口ICommodity,规范发放奖励这一行为(方法)
public interface ICommodity {
void sendCommodity(String uId, String commodityId, String bizId, Map<String, String> extMap) throws Exception; //extMap用于预留扩展字段
}
- 定义具体的活动奖励实现类,各自实现发放奖励的细节
/**
* 该类实现发放优惠卡细节
*/
public class CardCommodityService implements ICommodity {
public void sendCommodity(String uId, String commodityId, String bizId, Map<String, String> extMap) throws Exception {
//处理传入参数,发放成功
}
}
- 定义工厂StoreFactory类,对外暴露getCommodityService(Class<? extends ICommodity>)方法以获取实际对象。和根据类型编号获取实际对象方法getCommodityService(Integer)
public class StoreFactory {
/**
* 奖品类型方式实例化
* @param commodityType 奖品类型,需要提前根据产品定义好都有哪些类
* @return 实例化对象
*/
public ICommodity getCommodityService(Integer commodityType) {
if (null == commodityType) return null;
if (1 == commodityType) return new CouponCommodityService();
if (2 == commodityType) return new GoodsCommodityService();
if (3 == commodityType) return new CardCommodityService();
throw new RuntimeException("不存在的奖品服务类型");
}
/**
* 奖品类信息方式实例化
* @param clazz 奖品类
* @return 实例化对象
*/
public ICommodity getCommodityService(Class<? extends ICommodity> clazz) throws IllegalAccessException, InstantiationException {
if (null == clazz) return null;
return clazz.newInstance();
}
}