关于使用<枚举+接口+实现类>实现简单工厂模式

258 阅读1分钟

前言

SpringBoot项目,通过枚举+接口+实现类实现一个简单的工厂模式,逻辑比较简单,通过选择不同的确权方式来选择具体的确权实现类

注: 确权是我们自己的项目逻辑,你可以把它当成任何其他的逻辑,比如支付

代码

枚举

展示了几种确权方式

 @Getter
 @AllArgsConstructor
 @NoArgsConstructor
 @Slf4j
 public enum ConfirmationType {
 ​
     CORAL(1, "珊瑚链证书确权", ConfirmationServerName.CONFIRMATION_CORAL),
     TSA(2, "数字时间戳证书确权", ConfirmationServerName.CONFIRMATION_TSA),
     TDCHAIN(3, "信源链证书确权", ConfirmationServerName.CONFIRMATION_TBCHAIN),
     ;
 ​
     public int code;
 ​
     public String desc;
 ​
     public String serviceName;
 ​
     public static ConfirmationType getByCode(int code) {
         return Arrays.stream(ConfirmationType.values())
                 .filter(x -> x.getCode() == code)
                 .findFirst()
                 .<ApiException>orElseThrow(() -> {
                     log.warn("确权方式[{}]暂不支持", code);
                     throw new ApiException(BadRequestCode.PARAM_ERROR.getCode(), "暂不支持其他确权方式");
                 });
     }
 ​
 ​
     public static class ConfirmationServerName {
         public final static String CONFIRMATION_CORAL = "coralConfirmationService";
         public final static String CONFIRMATION_TSA = "tsaConfirmationService";
         public final static String CONFIRMATION_TBCHAIN = "tbChainConfirmationService";
     }
 ​
 }
 ​

确权接口

 public interface IConfirmationService {
     
     /**
      * 确权逻辑
      */
     ConfirmResult confirm(ConfirmationParam confirmationParam, QuequanDeveloperInfo developerInfo);
 ​
 }

确权具体实现

确权方式一:

 @Service(ConfirmationType.ConfirmationServerName.CONFIRMATION_CORAL)
 @Slf4j
 public class CoralConfirmationServiceImpl implements IConfirmationService {
 ​
     @Override
     public ConfirmResult confirm(ConfirmationParam confirmationParam, QuequanDeveloperInfo developerInfo) {
 ​
         // 具体逻辑
         // ...
         return null;
         
     }
 }

确权方式二:

 @Slf4j
 @Service(ConfirmationType.ConfirmationServerName.CONFIRMATION_TBCHAIN)
 public class TbChainConfirmationServiceImpl implements IConfirmationService {
 ​
 ​
     @Override
     public ConfirmResult confirm(ConfirmationParam confirmationParam, QuequanDeveloperInfo developerInfo) {
 ​
         // 具体逻辑
         // ...
         return null;
         
     }
 }

确权方式三:

...

简单工厂

 @Component
 @Slf4j
 public class ConfirmationServiceFactory {
 ​
     @Resource
     Map<String, IConfirmationService> confirmationServiceMaps;
 ​
     public IConfirmationService getInstance(ConfirmationType type) {
         return confirmationServiceMaps.entrySet().stream()
                 .filter(entry -> type.getServiceName().equalsIgnoreCase(entry.getKey()))
                 .findFirst()
                 .<ApiException>orElseThrow(() -> {
                     log.error("找不到指定的确权服务 确权类型为:{} 确权描述为:{}", type.getCode(), type.getDesc());
                     throw new ApiException(BadRequestCode.INTERNAL_ERROR);
                 })
                 .getValue();
 ​
     }
 ​
 }

通过工厂调用具体实现

 // 注入
 @Resource
 private ConfirmationServiceFactory confirmationServiceFactory;
 ​
 // 具体实现
 public Result<String> doConfirm(ConfirmationParam confirmationParam) {
 ​
   // 执行确权
   IConfirmationService iConfirmationService = confirmationServiceFactory.getInstance(confirmationType);
   ConfirmResult confirm = iConfirmationService.confirm(confirmationParam, developerInfo);
 ​
   // ...
 ​
   return null;
 ​
 }