gpt4 book ai didi

java - 类似工厂的图案,带 Spring bean ,没有开关盒

转载 作者:搜寻专家 更新时间:2023-11-01 00:54:06 25 4
gpt4 key购买 nike

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

我还尝试在枚举中实现策略模式。但是 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 跑车自救(正如其他人已经建议的那样)。

关于java - 类似工厂的图案,带 Spring bean ,没有开关盒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54702247/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com