比如我们有一个接口。

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);

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐