springboot下,使用enum实现简单工厂模式

比如我们有一个接口。

public interface EnPayService {

	public GenericResponse enpay(int tenantId, long punitId, String iden, double chargeMoney);

    PayType getPayType();
}

3个实现类

@Service
public class BocPayServiceImpl implements EnPayService {

	@Override
	public GenericResponse enpay(int tenantId, long punitId, String iden, double chargeMoney) {
        // 中行支付业务操作
		return null;
	}

	@Override
	public PayType getPayType() {
		return PayType.BOC;
	}
}
@Service
public class CcbServiceImpl implements EnPayService {


	@Override
	public GenericResponse enpay(int tenantId, long punitId, String iden, double chargeMoney) {
        // 建行支付业务操作
		return null;
	}

	@Override
	public PayType getPayType() {
		return PayType.CCB;
	}
}
@Service
public class IcbcServiceImpl implements EnPayService {

	@Override
	public GenericResponse enpay(int tenantId, long punitId, String iden, double chargeMoney) {
        // 工行支付业务操作
		return null;
	}

	@Override
	public PayType getPayType() {
		return PayType.ICBC;
	}

}

这里我们使用枚举来管理的bean的名称,这样我们可以在需要使用的时候,直接从枚举里面获取

public enum PayType {

	CCB(8, "建行支付"), // 建行支付
	ICBC(11, "工行支付"), // 工行支付
	BOC(15, "中行支付"); // 中行支付

	private int code;
	private String name;

	public static PayType resolve(int code) {
		for (PayType t : PayType.values()) {
			if (t.getCode() == code) {
				return t;
			}
		}
		return CCB;
	}

	private PayType(int code, String name) {
		this.code = code;
		this.name = name;
	}

	public int getCode() {
		return code;
	}

	public String getName() {
		return name;
	}

}

然后就可以创建我们的工厂类了

@Service
public class ExtPayFactory{

    private final Map<String, EnPayService> enPayServiceMap = new ConcurrentHashMap<>();

    public ExternalEnPayFactory(List<EnPayService> enpayServices) {
        enpayServices.forEach(e -> enPayServiceMap.put(Const.getStr(e.getPayType().getCode()), e));
    }

    public EnPayService get(int payType) {
        return enPayServiceMap.get(Const.getStr(payType));
    }
}

使用枚举,可以更好的管理bean的名称,让我们在工厂里面可以更直观的拿到相关bean的名称

这样我们就可以得到具体的service

		EnPayService enPayService = externalEnPayFactory.get(payType);
		if (enPayService == null) {
			return GenericResponseUtil.error("不支持的支付类型");
		}
		return enPayService.enpay(tenantId, punitId, iden, chargeMoney);

简单工厂模式是一种创建型设计模式,它提供了一个创建对象的统一接口,但由工厂来决定创建哪种具体的实例。以下是 C 语言实现简单工厂模式的示例代码: 首先,定义一个抽象的产品,它包含一个抽象方法: ``` typedef struct { void (*operation)(void); } Product; void product_operation(Product *product) { product->operation(); } ``` 然后,定义两个具体的产品,它们实现了抽象产品中的抽象方法: ``` typedef struct { Product product; } ConcreteProductA; static void concrete_product_a_operation(void) { printf("Concrete Product A Operation\n"); } ConcreteProductA *create_concrete_product_a(void) { ConcreteProductA *product = (ConcreteProductA *) malloc(sizeof(ConcreteProductA)); product->product.operation = concrete_product_a_operation; return product; } typedef struct { Product product; } ConcreteProductB; static void concrete_product_b_operation(void) { printf("Concrete Product B Operation\n"); } ConcreteProductB *create_concrete_product_b(void) { ConcreteProductB *product = (ConcreteProductB *) malloc(sizeof(ConcreteProductB)); product->product.operation = concrete_product_b_operation; return product; } ``` 接着,定义一个简单工厂,它根据客户端的需求,创建具体的产品实例: ``` typedef enum { ProductTypeA, ProductTypeB } ProductType; Product *create_product(ProductType type) { switch (type) { case ProductTypeA: return (Product *) create_concrete_product_a(); case ProductTypeB: return (Product *) create_concrete_product_b(); default: return NULL; } } ``` 最后,在客户端代码中调用简单工厂的创建方法,创建具体的产品实例并调用其方法: ``` int main() { Product *product = create_product(ProductTypeA); product_operation(product); product = create_product(ProductTypeB); product_operation(product); return 0; } ``` 输出结果为: ``` Concrete Product A Operation Concrete Product B Operation ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木小百99

听说打赏的人都发财了

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值