设计模式之简单工厂模式

目录

  • 定义
  • 结构
  • 应用场景
  • 实现示例

定义

定义一个创建对象的类,由该类来封装实例化对象的行为。客户端只需要知道产品类型,不需要关系具体的创建细节。

结构

在这里插入图片描述

应用场景

适用于对象创建逻辑相对简单,产品类型有限且变化不频繁的场景,主要价值在于封装变化(创建逻辑)和解耦客户端与具体产品。

实现示例

通过简单工厂模式,整合多种支付方式,使系统能够灵活支持不同的支付渠道。

定义抽象产品

/*** 抽象产品,支付接口*/
public interface PaymentGateway {void processPayment(String orderId, BigDecimal amount);String getGatewayName();}

具体产品1:支付宝支付

/*** 支付宝支付*/
public class AlipayPayment implements PaymentGateway {@Overridepublic String getGatewayName() {return "支付宝支付";}@Overridepublic void processPayment(String orderId, BigDecimal amount) {System.out.println("[支付宝支付],处理订单号:" + orderId);System.out.println("支付金额:" + amount);System.out.println("调用支付宝API,订单支付成功!");}
}

具体产品2:银联支付

/*** 银联支付*/
public class UnionPayPayment implements PaymentGateway{@Overridepublic String getGatewayName() {return "银联支付";}@Overridepublic void processPayment(String orderId, BigDecimal amount) {System.out.println("[银联支付],处理订单号:" + orderId);System.out.println("支付金额:" + amount);System.out.println("调用银联API,订单支付成功!");}
}

具体产品3:微信支付

/*** 微信支付*/
public class WechatPayment implements PaymentGateway{@Overridepublic String getGatewayName() {return "微信支付";}@Overridepublic void processPayment(String orderId, BigDecimal amount) {System.out.println("[微信支付],处理订单号:" + orderId);System.out.println("支付金额:" + amount);System.out.println("调用微信API,订单支付成功!");}
}

定义工厂类


public class PaymentFactory {public static PaymentGateway createPaymentGateway(String paymentMethod) {switch (paymentMethod.toLowerCase()) {case "wechat":return new WechatPayment();case "alipay":return new AlipayPayment();case "unionpay":return new UnionPayPayment();default:throw new IllegalArgumentException("Unsupported payment method: " + paymentMethod);}}}

测试


public class Client {public static void main(String[] args) {PaymentGateway alipay = PaymentFactory.createPaymentGateway("alipay");alipay.processPayment("HJ0001", new BigDecimal("129.9"));PaymentGateway wechat = PaymentFactory.createPaymentGateway("wechat");wechat.processPayment("HJ0002", new BigDecimal("123.9"));}}