在电商系统中,使用 工厂模式 管理不同类型优惠券的创建 非常合适。以下是详细分析:
1. 为什么适合使用工厂模式?
(1) 优惠券的创建逻辑符合工厂模式的核心场景
- 统一入口:优惠券类型(满减券、折扣券等)有 共同的抽象接口(例如
Coupon
接口定义apply()
方法),但具体实现不同。 - 条件化创建:根据业务规则(如用户领券类型、活动配置等)动态创建不同优惠券。
- 扩展性强:新增优惠券类型时(例如新增「积分兑换券」),无需修改客户端代码,只需扩展工厂和新增具体券类。
(2) 代码示例
// 抽象优惠券接口
public interface Coupon {
void apply(Order order);
}
// 具体优惠券实现
public class FullReductionCoupon implements Coupon {
@Override
public void apply(Order order) {
// 满减逻辑:订单满100减20
}
}
public class DiscountCoupon implements Coupon {
@Override
public void apply(Order order) {
// 折扣逻辑:订单打8折
}
}
// 优惠券工厂(简单工厂模式)
public class CouponFactory {
public static Coupon createCoupon(String type) {
switch (type) {
case "FULL_REDUCTION":
return new FullReductionCoupon();
case "DISCOUNT":
return new DiscountCoupon();
// 扩展点:新增类型只需加case分支
default:
throw new IllegalArgumentException("Invalid coupon type");
}
}
}
// 客户端调用
Coupon coupon = CouponFactory.createCoupon("FULL_REDUCTION");
coupon.apply(order);
2. 如何选择工厂模式的具体类型?
(1) 简单工厂模式
- 适用场景:优惠券类型较少且创建逻辑简单,无需动态扩展。
- 优点:代码简洁,快速实现。
- 缺点:新增类型需修改工厂类,违反开闭原则(OCP)。
(2) 工厂方法模式
- 适用场景:优惠券类型较多或未来可能频繁扩展。
- 实现方式:为每类优惠券定义一个子工厂(例如
FullReductionCouponFactory
、DiscountCouponFactory
)。 - 优点:符合开闭原则,新增类型只需添加新工厂类。
- 代码示例:
public interface CouponFactory { Coupon createCoupon(); } public class FullReductionCouponFactory implements CouponFactory { @Override public Coupon createCoupon() { return new FullReductionCoupon(); } }
(3) 抽象工厂模式
- 适用场景:需要 统一创建一组关联的优惠券(例如不同活动类型对应不同券组合)。
- 示例:双11活动工厂创建「满减券+积分券」,618活动工厂创建「折扣券+无门槛券」。
- 代码示例:
public interface ActivityFactory { Coupon createCoupon(); Gift createGift(); // 可能同时创建赠品 } public class Double11ActivityFactory implements ActivityFactory { @Override public Coupon createCoupon() { return new FullReductionCoupon(); } @Override public Gift createGift() { return new PointsGift(); } }
3. 工厂模式带来的实际收益
- 代码解耦:客户端无需关心优惠券的具体实现,只需依赖抽象接口。
- 可维护性:集中管理优惠券的创建逻辑,避免重复代码。
- 动态配置:可通过配置文件或数据库动态决定创建哪种优惠券(例如从数据库读取活动配置的券类型)。
- 测试友好:工厂模式便于 Mock 测试,只需替换工厂实现。
4. 何时不适合用工厂模式?
- 创建逻辑极其简单:如果只有1-2种固定优惠券类型,直接
new
更简单。 - 创建过程依赖复杂上下文:例如需要根据用户历史行为动态生成优惠券参数,可能更适合用策略模式+工厂模式组合。
总结
在电商系统中,使用 工厂方法模式 管理优惠券创建是最佳实践,既能应对未来扩展,又能保持代码整洁。若涉及多组关联优惠券,可升级为抽象工厂模式。