下沙开发区建设局网站wordpress aike
2026/6/20 10:12:08 网站建设 项目流程
下沙开发区建设局网站,wordpress aike,聊天软件开发流程,辽宁省建设工程信息网公告每日Java面试场景题知识点之-工厂方法模式 场景问题描述 在开发一个电商平台支付系统时#xff0c;技术团队面临以下挑战#xff1a; 系统需要集成多种支付渠道#xff0c;包括支付宝、微信支付、银联支付等。最初采用硬编码方式实现支付逻辑#xff0c;每次新增支付渠道都…每日Java面试场景题知识点之-工厂方法模式场景问题描述在开发一个电商平台支付系统时技术团队面临以下挑战系统需要集成多种支付渠道包括支付宝、微信支付、银联支付等。最初采用硬编码方式实现支付逻辑每次新增支付渠道都需要修改核心业务代码严重违反了开闭原则。同时支付逻辑与渠道创建高度耦合导致系统扩展困难单次支付接口改造平均耗时达到3.5人日。问题核心如何在不修改现有代码的情况下轻松添加新的支付渠道如何实现支付对象创建与业务逻辑的解耦如何确保系统的可扩展性和可维护性技术栈分析针对这类场景问题Java开发中常用的解决方案包括工厂方法模式推荐抽象工厂模式策略模式依赖注入技术选型理由工厂方法模式最适合解决对象创建与使用的解耦问题符合开闭原则是企业级项目开发中的首选方案。工厂方法模式解决方案模式核心概念工厂方法模式定义了一个创建对象的接口但由子类决定要实例化哪一个类。它让类的实例化延迟到子类解决了对象创建与使用的强耦合问题。解决方案架构1. 定义支付接口public interface PaymentProcessor { PaymentResult process(PaymentRequest request); }2. 实现具体支付处理器// 支付宝支付处理器 public class AlipayProcessor implements PaymentProcessor { Override public PaymentResult process(PaymentRequest request) { // 支付宝支付逻辑 System.out.println(处理支付宝支付: request.getAmount()); return new PaymentResult(ALIPAY, SUCCESS, request.getAmount()); } } // 微信支付处理器 public class WechatPayProcessor implements PaymentProcessor { Override public PaymentResult process(PaymentRequest request) { // 微信支付逻辑 System.out.println(处理微信支付: request.getAmount()); return new PaymentResult(WECHAT, SUCCESS, request.getAmount()); } } // 银联支付处理器 public class UnionPayProcessor implements PaymentProcessor { Override public PaymentResult process(PaymentRequest request) { // 银联支付逻辑 System.out.println(处理银联支付: request.getAmount()); return new PaymentResult(UNIONPAY, SUCCESS, request.getAmount()); } }3. 创建支付工厂public class PaymentFactory { // 支付方式枚举 public enum PaymentType { ALIPAY, WECHAT, UNIONPAY } /** * 根据支付类型创建对应的支付处理器 * param paymentType 支付类型 * return 支付处理器实例 */ public PaymentProcessor createProcessor(PaymentType paymentType) { switch (paymentType) { case ALIPAY: return new AlipayProcessor(); case WECHAT: return new WechatPayProcessor(); case UNIONPAY: return new UnionPayProcessor(); default: throw new IllegalArgumentException(不支持的支付方式: paymentType); } } /** * 通过字符串创建支付处理器用于配置化 * param paymentTypeStr 支付类型字符串 * return 支付处理器实例 */ public PaymentProcessor createProcessor(String paymentTypeStr) { PaymentType paymentType PaymentType.valueOf(paymentTypeStr.toUpperCase()); return createProcessor(paymentType); } }4. 业务服务层public class PaymentService { private PaymentFactory paymentFactory; public PaymentService() { this.paymentFactory new PaymentFactory(); } /** * 处理支付请求 * param paymentType 支付类型 * param amount 支付金额 * return 支付结果 */ public PaymentResult processPayment(String paymentType, BigDecimal amount) { try { // 1. 创建支付请求 PaymentRequest request new PaymentRequest(amount); // 2. 通过工厂创建支付处理器 PaymentProcessor processor paymentFactory.createProcessor(paymentType); // 3. 处理支付 PaymentResult result processor.process(request); // 4. 记录日志 System.out.println(支付完成: result); return result; } catch (Exception e) { System.err.println(支付处理失败: e.getMessage()); return new PaymentResult(paymentType, FAILED, amount); } } }5. 支持类定义// 支付请求类 public class PaymentRequest { private BigDecimal amount; private String orderId; private Date timestamp; public PaymentRequest(BigDecimal amount) { this.amount amount; this.orderId ORDER_ System.currentTimeMillis(); this.timestamp new Date(); } // getters and setters public BigDecimal getAmount() { return amount; } public String getOrderId() { return orderId; } public Date getTimestamp() { return timestamp; } } // 支付结果类 public class PaymentResult { private String paymentType; private String status; private BigDecimal amount; private String transactionId; public PaymentResult(String paymentType, String status, BigDecimal amount) { this.paymentType paymentType; this.status status; this.amount amount; this.transactionId TXN_ System.currentTimeMillis(); } Override public String toString() { return String.format(PaymentResult{type%s, status%s, amount%s, txnId%s}, paymentType, status, amount, transactionId); } // getters public String getStatus() { return status; } public String getPaymentType() { return paymentType; } }6. 客户端调用示例public class PaymentClient { public static void main(String[] args) { PaymentService paymentService new PaymentService(); // 测试不同支付方式 testPayment(paymentService, ALIPAY, new BigDecimal(100.00)); testPayment(paymentService, WECHAT, new BigDecimal(200.00)); testPayment(paymentService, UNIONPAY, new BigDecimal(300.00)); } private static void testPayment(PaymentService service, String type, BigDecimal amount) { System.out.println(\n 测试 type 支付 ); PaymentResult result service.processPayment(type, amount); System.out.println(支付结果: result); } }方案优势分析1. 符合开闭原则对扩展开放新增支付渠道只需添加新的处理器实现类和枚举值对修改封闭现有的支付处理器和业务逻辑无需修改2. 职责分离清晰PaymentProcessor专注于支付业务逻辑PaymentFactory专注于对象创建PaymentService专注于业务流程协调3. 易于测试和维护每个支付处理器可独立测试工厂逻辑简单明确业务流程易于理解实际应用优化1. 配置化支持Configuration public class PaymentConfig { Bean public PaymentFactory paymentFactory() { PaymentFactory factory new PaymentFactory(); // 可以从配置文件读取支持的支付方式 return factory; } Bean public MapString, PaymentProcessor paymentProcessors() { MapString, PaymentProcessor processors new HashMap(); processors.put(ALIPAY, new AlipayProcessor()); processors.put(WECHAT, new WechatPayProcessor()); processors.put(UNIONPAY, new UnionPayProcessor()); return processors; } }2. 集成Spring框架Service public class SpringPaymentService { Autowired private MapString, PaymentProcessor paymentProcessors; public PaymentResult processPayment(String paymentType, BigDecimal amount) { PaymentProcessor processor paymentProcessors.get(paymentType.toUpperCase()); if (processor null) { throw new IllegalArgumentException(不支持的支付方式: paymentType); } return processor.process(new PaymentRequest(amount)); } }面试要点总结关键回答要点问题识别硬编码导致的扩展性问题、违反开闭原则模式选择工厂方法模式解决对象创建与使用解耦实现方案接口定义、具体实现、工厂类、业务服务技术优势符合SOLID原则、易于扩展、职责分离常见追问及回答Q: 为什么不直接用new关键字A: 直接使用new会导致客户端与具体实现类强耦合违反依赖倒置原则不利于系统扩展和测试。Q: 工厂方法模式与抽象工厂模式有什么区别A: 工厂方法模式创建单一产品抽象工厂模式创建产品族。当前场景只需创建支付处理器适合工厂方法模式。Q: 如何保证线程安全A: 支付处理器通常是无状态的工厂方法本身也是无状态的因此在多线程环境下是安全的。如果有状态需求可以考虑使用ThreadLocal或同步机制。感谢读者观看希望这篇工厂方法模式的实战解析能帮助你在Java企业级开发中更好地应用设计模式构建高质量的可扩展系统。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询