创建型-工厂模式 Link to heading

工厂模式又称为简单工厂模式,属于创建型设计模式的一种。

这种设计模式提供了按需创建对象的最佳方式。不会对外暴露创建细节,并且会通过一个统一的接口创建所需的对象。

它主要的意图是定义一个创建对象的接口,让其子类自己决定将哪一个工厂类实例化,工厂模式使创建过程延迟到子类中进行。

场景模拟 Link to heading

模拟发放多种奖品,在营销场景中,经常会约定在用户完成打卡、分享、留言、邀请注册等一系列行为操作后进行返利积分的操作。用户再通过返利积分兑换奖品,让整个系统构成一个生态闭环。

现假设有以下三种类型的商品接口。

// 优惠券
CouponResult sendCoupon(String uId, String couponNumber, String uuid);

// 实物商品
Boolean deliverGoods(DeliverReq req);

// 第三方兑换卡
void grantToken(String bindMobileNumber, String cardId);

三个接口返回值类型不同,入参不同,并且未来可能会扩展的兑换场景。

最初设计 Link to heading

工程结构

├─AwardReq.java
├─AwardRes.java
└─PrizeController.java

实现

public class PrizeController{
  public AwardRes awardToUser(AwardReq req){
    if(req.type == "优惠券"){
      // do something
      CouponResult result = sendCoupon(req.uId,req.conponNumber,req.uuid);
      return AwardRes(result);
    }else if(req.type == "实物"){
      DelilverReq deliverReq = new DeliverReq();
      // do something
      Boolean result = deliverGoods(deliverReq);
      return AwardRes(result);
    }else if(req.type == "第三方兑换卡"){
      grantToken(req.bindMobileNumber,req.cardId);
      return AwardRes(true);
    }
  }
}

不利于扩展,难以维护。

重构代码 Link to heading

工程结构

├─store
│ ├─imple
│ │ ├─CardCommodityService.java
│ │ ├─CouponCommodityService.java
│ │ └─GoodsCommodityService.java
│ └─Icommodity.java
└─StoreFactory.java
classDiagram ICommodity <|.. CardCommidityService : 实现 ICommodity <|.. CouponCommidityService : 实现 ICommodity <|.. GoodsCommidityService : 实现 ICommodity <.. StoreFactory : 依赖

创建商店工厂

public class StoreFactory{
  // 奖品类型方式实例化
  public ICommodity getCommodityService(int type){
    if(type == 1) return new ComponCOmmodityService();
    if(type == 2) return new GoodsCommodityService();
    if(type == 3) return new CardCommodityService();
    throw new RuntimeException("不存在的类型");
  }
}

定义发奖接口

public interface ICommodity{
  void sendCommodity(String uId, Strimg commodityId, String bizId, Map<String, String> extMap) throw Exception;
}

实现三种发奖接口

public class CouponCommodityService implements ICommodity{
  @Override
  public void sendCommodity(String uId, Strimg commodityId, String bizId, Map<String, String> extMap){
    // do something
  }
}

public class GoodsCommodityService implements ICommodity{
  @Override
  public void sendCommodity(String uId, Strimg commodityId, String bizId, Map<String, String> extMap){
    // do something
  }
}

public class CardCommodityService implements ICommodity{
  @Override
  public void sendCommodity(String uId, Strimg commodityId, String bizId, Map<String, String> extMap){
    // do something
  }
}

总结 Link to heading

避免创建者与具体产品逻辑耦合;

满足单一职责原则,每一个业务逻辑都在相应实现类中完成;

满足开闭原则,无需更改调用方就可以扩展新的类型。