工厂方法模式(创建者模式)

248 阅读1分钟

什么场景下使用?

  • 同一功能下多个接口返回格式不同
  • 同一功能下多个接口传入参数不同
  • 同一功能下业务可能会有同级接口拓展

一句话总结

定义一个创建对象的接口,让其子类自己决定要实例化那个一个工厂类。

优点

屏蔽功能的具体实现细节,外部只是调用就行

缺点

实现类多,不易后期维护

具体实现

代码结构

无标题.png

步骤(个人习惯,先定义接口)

  1. 定义同一接口ICommodity,规范发放奖励这一行为(方法)
public interface ICommodity {
    
    void sendCommodity(String uId, String commodityId, String bizId, Map<String, String> extMap) throws Exception; //extMap用于预留扩展字段

}

  1. 定义具体的活动奖励实现类,各自实现发放奖励的细节
/** 
* 该类实现发放优惠卡细节
*/
public class CardCommodityService implements ICommodity {
    public void sendCommodity(String uId, String commodityId, String bizId, Map<String, String> extMap) throws Exception {
       //处理传入参数,发放成功
       
       
    }
}
  1. 定义工厂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();
    }

}