出厂样式,带弹簧豆,不带开关盒

时间:2019-02-15 03:18:15

标签: java spring switch-statement case factory

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

我也尝试在枚举中实现Stategy模式。但是无法自动装配bean。

请参阅下面的当前代码。

{'GET': {'GREEN': 2}, 'POST': {'GREEN': 2}, 'Query': {'GREEN': 1, 'RED': 1}, 'Cookie': {'RED': 2}, 'String': {'RED': 2}, 'Body': {'BLUE': 2}}
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
     }

}

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

对不起,我无法发表评论。在这里,汽车的类型决定了汽车的服务。我不确定策略模式是否适合这里。当同一辆车出现不同的服务行为时,我将使用策略模式。例如:夏季我想使用 XService ,而冬季我想对 AUDI 使用 YService 。我看到两种实现方法。

  1. 在创建汽车对象期间注入服务。通过这种实施方式,汽车与服务紧密结合。我不建议您这样做,除非您有充分的理由不遵循第2点。
  2. 使用if / else或分支机构来确定汽车的类型并致电所需的服务。

答案 1 :(得分:0)

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

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