创建型-工厂模式 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
避免创建者与具体产品逻辑耦合;
满足单一职责原则,每一个业务逻辑都在相应实现类中完成;
满足开闭原则,无需更改调用方就可以扩展新的类型。