Я бы не совмещал фабрики с DI. Это просто сбивает с толку. Например, здесь мы используем внедрение зависимости:
public void setValuesProvider(ValuesProvider provider) {
this.valuesProvider = provider;
}
Но, подождите, здесь мы используем фабрику:
private void initDefaults() {
if(valuesProvider == null) {
valuesProvider = DefaultsFactory.getDefaultValuesProvider();
}
}
Может быть, я просто медленнее, чем большинство, но для меня это выглядит шизофренично. Если вы хотите использовать DI, используйте DI. Либо настройте определенного (именованного) поставщика по умолчанию и вызовите его так:
setValuesProvider(myDefaultProvider)
Обратите внимание, что в этом случае вам придется тщательно задокументировать это. Или другим способом было бы просто использовать какое-то умное наследование (или, может быть, с помощью статики?), Чтобы иметь возможность вернуть ЛЮБОЙ ValuesProvider
в состояние по умолчанию:
setValuesProvider(myProvider.defaultState())
Последнее имеет наибольшее значение для меня. Идея здесь заключается в том, что всякий раз, когда вы хотите поиграть с парсером, ValuesProvider
ДОЛЖЕН быть предоставлен. Таким образом, я бы, скорее всего, использовал DI через конструктор Parser()
.