比如我们有一个接口。
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);