有两种不同的类似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,可以将其连接到任何需要scale实例的类中。在初始化时,它将获取
ScaleFactoriesSpring上下文中定义的所有内容,并将它们自动连接为
List<ScaleFactory>,然后将其转换为a
Map(其中
ScaleFactory类型为键)。这样可以避免担心的类名
Scale,并且可以稍后更改它们(只要您保持
type键的一致性)。
ScaleFactory然后,您的实现可以执行他们需要做的任何事情。例如,如果您拥有一种
Scale不可变的类型,则可以让工厂每次都返回相同的实例。另外,您可以让每个调用返回一个单独的实例-
实例化
Scale取决于实现的工厂。



