该设计模式在实际业务开发中用的比较多,比如像一些业务支付中台项目中使用广泛。增加代码可读性以及高维护性,增加代码美观以及减少代码量。
1、调用方式
@GetMapping("/test")
public CommonResult<String> test(@RequestParam("route") TestRoute route){
return CommonResult.success(TestFactory.getService(route).value());
}
2、类型枚举类
/**
* 类型枚举类
* @date 2023/10/18 14:03
* @author luohao
*/
public enum TestRoute {
TEST1,
TEST2,
TEST3;
}
3、工厂类
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 工厂类
* @date 2023/10/18 14:11
* @author luohao
*/
@Component
public class TestFactory {
private static TestFactory factory;
private Map<TestRoute, TestService> serviceMap = new HashMap<>();
public TestFactory(List<TestService> serviceList) {
for (TestService paymentService : serviceList) {
List<TestRoute> routes = paymentService.routes();
for (TestRoute route : routes) {
if (!serviceMap.containsKey(route)) {
serviceMap.put(route,paymentService);
}
}
}
factory = this;
}
public static TestService getService(TestRoute payRoute){
TestService paymentService = factory.getServiceMap().get(payRoute);
if(paymentService == null){
throw new RuntimeException("the payRoute["+payRoute+"] hasn't implement");
}
return paymentService;
}
public Map<TestRoute, TestService> getServiceMap() {
return serviceMap;
}
}
4、接口类
import java.util.List;
/**
* 接口类
* @date 2023/10/18 14:02
* @author luohao
*/
public interface TestService {
/**
* 路由
* @return
*/
List<TestRoute> routes();
/**
* 返回参数
* @return
*/
String value();
}
5、实现类A
import com.google.common.collect.Lists;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* 实现类A
* @date 2023/10/18 14:01
* @author luohao
*/
@Service
public class TestAServiceImpl implements TestService{
@Override
public List<TestRoute> routes() {
return Lists.newArrayList(TestRoute.TEST1, TestRoute.TEST2);
}
@Override
public String value() {
return "吃饭";
}
}
6、实现类B
import com.google.common.collect.Lists;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* 实现类B
* @date 2023/10/18 14:01
* @author luohao
*/
@Service
public class TestBServiceImpl implements TestService{
@Override
public List<TestRoute> routes() {
return Lists.newArrayList(TestRoute.TEST3);
}
@Override
public String value() {
return "睡觉";
}
}