Как лучше реализовать фабричный шаблон с поддержкой весенней загрузки? - PullRequest
1 голос
/ 07 июня 2019

Лучший способ реализовать фабричный шаблон в Spring boot.

У меня есть интерфейс и несколько его реализаций. Во время запроса мне нужно вернуть компонент на основе входной строки.

Есть несколько способов, которыми я могу это сделать. Но какой самый лучший способ?

interface vehicle {
void drive();
string getVehicleName();
}

@Component
public class Car implements vehicle {
  private static string prop = "car";
  @Override
  string getVehicleName() { return prop;}

  @Override
  void drive() {}
}

@Component
public class Bike implements vehicle {
  private static string prop = "bike";

  @Override
  string getVehicleName() { return prop;}

  @Override
  void drive() {}
}

@Service
public class VehicleFactory {
    @Autowired
    private List<vehicle> vehicles;

    private static final HashMap<String, vehicle> requestVehicleMap = new HashMap<>();

    @PostConstruct
    public void initVehicleFactory() {
        for(vehicle vehicle : vehicles) {
            requestVehicleMap.put(vehicle.getVehicleName(), request);
        }
    }

    public static vehicle getVehicleImpl(String vehicleName) {
        return requestVehicleMap.get(vehicleName);
    }
}

Это дает мне правильный класс. Также есть «квалификатор», который можно использовать как Реализация пользовательского шаблона фабрики в Spring .

Но есть ли лучший подход?

1 Ответ

0 голосов
/ 07 июня 2019

Интерфейс и его реализация хороши, я бы просто изменил класс Factory только потому, что у вас уже есть список реализации, а затем зачем снова инициализировать его в карте

Я также прокомментирую предложения в коде

VehicleFactory

@Service
public class VehicleFactory {

    @Autowired
    private List<Vehicle> vehicles;

    public Vehicle getVehicleImpl(String vehicleName) { // You have already declared as @Service then why use static
          return vehicles.stream()
                .filter(vehicle -> vehicle.getVehicleName().equalsIgnoreCase(vehicleName)) // This will filter the Impl you needed from others
                .findFirst() 
                .orElseThrow(() -> new RuntimeException(String.format(" Invlaid Vehicle Name - %s", vehicleName))); // Incase Impl is not found it should throw an error or handle in some other ways
    }
}

Так что попробуйте

...