在我的Spring Boot应用中,我正在创建一个工厂,用于创建具有相同接口和依赖关系的不同对象。
@Component
public class FarmFactory {
@Autowired
private FarmRepo farmRepo;
public IFarm create(FarmType type) {
if (type == type.APPLE) {
return new AppleFarm(farmRepo);
} else if (type == type.ANIMAL) {
return new AnimalFarm(farmRepo);
} else {
return new EmptyFarm(farmRepo);
}
}
}
我想知道是否最好通过将其注入农场的每个子类(苹果,动物,空(来限制farmrepo依赖的范围。或者如果最好将单个依赖性保持在工厂的范围更高的范围内。
或者,依赖性farmrepo可以用类型传递到创建方法中,但不确定依赖性范围的经验规则是什么。
根据我的经验,良好的设计可以尽可能减少if-else
。因此,在您的情况下,我更喜欢将其注入每个子类。因此,将来,如果依赖性也有子类,您将具有更大的灵活性。
我建议创建您的真实实现的命名豆(Applefarm,Animalfarm ..(并注入farmrepo。在您工厂的情况下
@Component("appleFarm")
@RequiredArgsConstructor <- this is a Lombok feature check it out
public class AppleFarm implements Farm {
private final FarmRepo repo;
...
}
我假设您的IFARM实现是模型类。在模型中拥有存储库不是一个好习惯。您应该考虑将不同的IFARM实现的创建移至Farmrepo。
如果IFARM实现是某种管理业务逻辑的服务类,则应让Spring处理它,将Farmrepo实例注入给他们。在这种情况下,您最好考虑拥有抽象类而不是使用IFARM,因为Farmrepo是它们之间的普遍依赖性。
使用简单的工厂方法实例化所需的运行时类型没有错根据类型参数更改bahaviour,而不是使用多态性。