Java工厂模式 + 策略模式解决多重 if-else 问题,代码开源

Java工厂模式 + 策略模式解决多重 if-else 问题,代码开源问题场景假设需要实现支付功能 支持多种支付方式 支付宝 微信 银行卡 传统实现会使用多重 if else 判断支付类型 导致代码臃肿且违反开闭原则

大家好,欢迎来到IT知识分享网。

问题场景

假设需要实现支付功能,支持多种支付方式(支付宝、微信、银行卡)。传统实现会使用多重 if-else 判断支付类型,导致代码臃肿且违反开闭原则。

// 传统实现(存在隐患) public Payment createPayment(String type) { if ("alipay".equals(type)) { return new Alipay(); } else if ("wechat".equals(type)) { return new WechatPay(); } else if ("bank".equals(type)) { return new BankPay(); } else { throw new IllegalArgumentException("Unsupported payment type"); } }

优化方案:工厂 + 策略模式

1. 策略接口与实现

// 支付策略接口 public interface Payment { void pay(BigDecimal amount); } // 支付宝支付 public class Alipay implements Payment { @Override public void pay(BigDecimal amount) { System.out.println("支付宝支付:" + amount); } } // 微信支付 public class WechatPay implements Payment { @Override public void pay(BigDecimal amount) { System.out.println("微信支付:" + amount); } } // 银行卡支付 public class BankPay implements Payment { @Override public void pay(BigDecimal amount) { System.out.println("银行卡支付:" + amount); } }

2. 工厂类(核心优化)

import java.util.HashMap; import java.util.Map; import java.util.function.Supplier; public class PaymentFactory { // 支付类型与构造方法的映射 private static final Map<String, Supplier<Payment>> PAYMENT_MAP = new HashMap<>(); // 初始化注册支付方式(符合开闭原则) static { PAYMENT_MAP.put("alipay", Alipay::new); PAYMENT_MAP.put("wechat", WechatPay::new); PAYMENT_MAP.put("bank", BankPay::new); } // 获取支付实例 public static Payment getPayment(String type) { Supplier<Payment> paymentSupplier = PAYMENT_MAP.get(type); if (paymentSupplier == null) { throw new IllegalArgumentException("不支持的支付类型: " + type); } return paymentSupplier.get(); } // 动态注册新支付方式(无需修改工厂代码) public static void registerPayment(String type, Supplier<Payment> supplier) { PAYMENT_MAP.put(type, supplier); } }

3. 客户端调用

public class Client { public static void main(String[] args) { // 使用标准支付 Payment alipay = PaymentFactory.getPayment("alipay"); alipay.pay(new BigDecimal("100.50")); // 使用新支付方式(无需修改工厂) PaymentFactory.registerPayment("crypto", CryptoPay::new); Payment crypto = PaymentFactory.getPayment("crypto"); crypto.pay(new BigDecimal("0.5")); } } // 新增的加密货币支付(符合开闭原则) class CryptoPay implements Payment { @Override public void pay(BigDecimal amount) { System.out.println("加密货币支付:" + amount + " BTC"); } }

方案优势

  1. 消除条件判断:用 Map 替代 if-else 分支
  2. 开闭原则:新增支付方式只需注册,无需修改工厂
  3. 解耦:客户端与具体支付实现解耦
  4. 可扩展性:支持动态注册新策略
  5. 代码简洁:工厂类职责单一,逻辑清晰

类图

Java工厂模式 + 策略模式解决多重 if-else 问题,代码开源

适用场景

  1. 需要根据不同条件执行不同算法
  2. 系统需要支持多种同类策略
  3. 存在频繁增加新策略的需求
  4. 需要消除复杂的条件分支语句

关键点:工厂负责对象创建,策略封装算法逻辑,两者结合实现创建与执行的解耦。通过注册机制支持动态扩展,彻底消除 if-else 分支判断。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/189241.html

(0)
上一篇 2025-09-29 08:33
下一篇 2025-09-29 09:00

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信