我的目标是根据枚举返回一个方法。目前,我已经创建了一个工厂,但是它使用的是我不喜欢的开关盒。代码工作正常,但我想使用更好的模式并替换当前的开关盒。如果没有任何开关盒或其他情况(例如),您将如何设计它?

我也尝试在枚举中实现Stategy模式。但是无法 Autowiring bean。

参见下面我的当前代码。

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;

     }

}

感谢您的任何帮助。

最佳答案

在仅替换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(..);
}

使用通用接口(interface):
private interface CarService<T extends SuperCar> {
   void save(T car);
}

无论如何,我会重新考虑您的对象模型,以让 super 跑车自行保存(正如其他人已经提出的那样)。

09-19 06:29