заводская модель с пружинными бобами без корпуса переключателя - PullRequest
0 голосов
/ 15 февраля 2019

Моя цель - вернуть метод в зависимости от перечисления.В настоящее время я создал фабрику, но она использует корпус переключателя, который мне не нравится.Код работает нормально, но я хочу использовать лучший шаблон и заменить текущий случай переключения.Как бы вы спроектировали это без какого-либо переключателя или если бы (экземпляр) ...

Я также попытался реализовать шаблон Stategy в enum.Но автопроводка бобов невозможна.

Смотрите ниже мой текущий кусок кода.

public enum Car {
     AUDI, FORD;
}
public class SuperCar{
     private Car car;
}
public class Audi extends SuperCar{
     // some other properties
}
public class Ford extends SuperCar{
     // some other properties
}
@Service
public class AudiService{

     public void save(Audi audi){
         // some code
     }

}
@Service
public class FordService{

     public void save(Ford ford){
         // some code
     }

}
@Service
public class CarFactory{

     private FordService fordService;
     private AudiService audiService;

     public CarFactory(FordService fordService, AudiService audiService) {
           this.fordService = fordService;
           this.audiService = AudiService;     
     }

     public void saveCar(SuperCar superCar){
         switch(superCar.getCar()):
             case AUDI:
                 return audiService.save((Audi)superCar));
             case FORD:
                 return fordService.save((Ford)superCar));
             default:
                 return null;

     }

}

Спасибо за любую помощь.

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

В случае простой замены switch, я бы всегда предпочел более декларативный подход с использованием map, так как он легче поддерживать и читать:

private Map<Car, CarService> services;

public CarFactory(FordService fordService, AudiService audiService) {
   this.services = Map.of(Car.FORD, fordService, Car.AUDI, audiService);
}

public void saveCar(SuperCar superCar) {
   CarService service = services.get(superCar.getCar());
   if (service != null) service.save(..);
}

с универсальныминтерфейс:

private interface CarService<T extends SuperCar> {
   void save(T car);
}

В любом случае, я бы переосмыслил вашу объектную модель, чтобы позволить суперкару сохранить себя (как уже предлагали другие).

0 голосов
/ 15 февраля 2019

Извините, что не могу комментировать.Здесь тип автомобиля определяет автосервис.Я не уверен, подходят ли здесь шаблоны стратегий.Я бы использовал шаблон стратегии, когда есть различное служебное поведение для того же автомобиля .Например: летом я хочу использовать XService , а зимой я хочу использовать YService для AUDI .Я вижу два способа реализовать это.

  1. Внедрить сервис при создании объекта автомобиля.Благодаря этой реализации автомобиль тесно связан с обслуживанием.Я не рекомендую этого, если у вас нет веских причин не следовать пункту 2.
  2. Используйте if / else или ответвление, чтобы определить тип автомобиля и вызвать нужную службу.
...