gpt4 book ai didi

java - Spring ServiceLocator 还是纯工厂模式?

转载 作者:IT老高 更新时间:2023-10-28 13:59:13 24 4
gpt4 key购买 nike

我 99% 的依赖是通过 @Autowired Spring 注解使用 DI 模式管理的。

尽管如此,在特定场景中,直到运行时我才能确定要使用哪个实现。

最广为人知的情况,是解析器的多重实现。

第一种解决方案是使用多个@Autowired(丑陋模式)

Interface Parser {
<T> T parse();
}

@Component("JsonParser")
class JsonParser implements Parser {
...
}

@Component("XmlParser")
class XmlParser implements Parser {
...
}

class MyService {
@Autowired
@Qualifier("XmlParser")
Parser xmlParser;

@Autowired
@Qualifier("JsonParser")
Parser jsonParser;

...
}

但是如果我有大量的实现是不能接受的。

第二种解决方案是使用 Spring 中的 ServiceLocator

interface ParserServiceLocatorFactory {
public Parser getParser(String parserName);
}

interface Parser {
<T> T parse();
}

@Component("JsonParser")
class JsonParser implements Parser {
...
}

@Component("XmlParser")
class XmlParser implements Parser {
...
}

class MyService {
@Autowired
ServiceFactory parserServiceLocatorFactory;

void exampleMethod() {
Parser xmlParser = parserServiceLocatorFactory.getParser("XmlParser");
}
}

这种方式对我来说似乎是正确的,但与第三种解决方案相比?

第三种方案是使用纯工厂模式并注入(inject)。

@Component
public ParserFactory {
Parser getParser(String parserName) {
...
}
}

interface Parser {
<T> T parse();
}

@Component("JsonParser")
class JsonParser implements Parser {
...
}

@Component("XmlParser")
class XmlParser implements Parser {
...
}

class MyService {
@Autowired
ParserFactory parserFactory

void exampleMethod() {
Parser xmlParser = parserFactory.getParser("XmlParser");
}
}

如果您对以前的解决方案有赞成/反对意见,或者对我的问题有更好的解决方案?

PS:这是伪代码,我可能会遗漏一些小东西:)

最佳答案

作为一个选项,您可以使用列表注入(inject):

public class SomeService {

@Autowired
private List<Parser> parsers;

public doSomethingWithParser(...) {
...
Parser parser = getParser(JsonParser.class);
parser.parse(...);
...
}

private Parser getParser(Class<Parser> targetClass) {
Parser result = null;
for(Parser parser : parsers) {
if(parser.getClass().equals(targetClass)){
result = parser;
}
}
return transformer;
}

}

更好的是,你可以添加 Parser.isCompatibleWith(SomeInput input) 方法来简化paser检测代码。

关于java - Spring ServiceLocator 还是纯工厂模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18654668/

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