gpt4 book ai didi

java - 用Spring配置抽象工厂的实现类

转载 作者:行者123 更新时间:2023-11-30 08:06:18 25 4
gpt4 key购买 nike

对于我的应用程序,我有一个Scale 接口(interface)和多个实现此接口(interface)的类,例如NormalizedScaleLogScale 等。在一个在我的服务中,我需要创建许多 Scales,并且我想使用 Spring 来定义它应该创建的 Scale 的实现。我将如何实现这样的事情?

--

我想创建一个工厂 ScaleFactory,就像在抽象工厂模式中一样,我可以调用它 ScaleFactory.getScale() 来获得我实现的任何一个 Scale在 Spring XML 中配置:

class ScaleFactory {
Class<? extends Scale> scaleImplClass;
public static Scale getScale() {
return scaleImplClass.newInstance();
}
}


Scale myScale = ScaleFactory.getScale();

但是使用这种方法,我如何配置 ScaleFactory 应该使用 Spring XML 中的哪个实现?

--

另一种方法是将 ScaleFactory 设为 @Service,然后将 ScaleFactory 自动连接到我的服务中:

@Autowired
ScaleFactory scaleFactory;

...

Scale myScale = scaleFactory.getScale();

然后我可以使用 ScaleFactory 中的 Autowiring 属性来定义 scaleImplClass。但这看起来很奇怪,因为我的工厂也是一个服务,而且我有那个工厂的一个实例。

--

另一种方法是在我的服务中使用 Class scaleImplementationClass 属性而不是 ScaleFacotry 并像这样使用 ScaleFactory:

@Value("${scaleImplementationClass}")
Class scaleImplementationClass

...

Scale myScale = ScaleFactory.getScale(scaleImplementationClass);

但是这样工厂就毫无意义了,因为我也可以运行 scaleImplementationClass.newInstance()

最佳答案

有几种不同的类似 Spring 的方法可以处理这个问题。我个人采用的方法看起来有点像这样:

public interface ScaleFactory {

public Scale newInstance();
public String type();

}

public class FirstScaleFactory implements ScaleFactory {

public Scale newInstance() {
return new FirstScale();
}

public String type() {
return "first";
}

}

public class SecondScaleFactory implements ScaleFactory {

public Scale newInstance() {
return new SecondScale();
}

public String type() {
return "second";
}

}

public class ScaleManager {

private final Map<String, ScaleFactory> factories;

@Autowired
public ScaleManager(List<ScaleFactory> factories) {
this.factories = factories.stream()
.collect(Collectors.toMap(f -> f.type(), Function::identity));
}

public Scale newInstance(String type) {
return Optional.ofNullable(factories.get(type))
.map(factory -> factory.newInstance())
.orElseThrow(IllegalArgumentException::new);
}

}

通过这种方法,您的 ScaleManager是一个标准的 Spring bean,可以连接到任何需要比例实例的类中。在初始化时,它获取所有 ScaleFactories在 Spring 上下文中定义的,并将它们 Autowiring 为 List<ScaleFactory> ,然后转换为 Map (其中 ScaleFactory 类型是关键)。这避免了您需要担心 Scale 的类名,并让您能够稍后更改它们(只要您保持 type 键一致)`

你的 ScaleFactory然后实现可以做他们需要做的任何事情。例如,如果您有一种类型 Scale你知道它是不可变的,你可以让工厂每次都返回相同的实例。或者,您可以让每个调用返回一个单独的实例 - Scale 的实例化取决于依赖于实现的工厂。

关于java - 用Spring配置抽象工厂的实现类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34465900/

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