Я работаю над своего рода библиотекой парсера значений параметров. Я бы хотел, чтобы Parser был определен следующим образом:
public class Parser {
private ValuesConfiguration configuration;
private ValuesProvider valuesProvider;
private ValuesMapper valuesMapper;
public Parser(ValuesConfiguration configuration) {
this.configuration = configuration;
}
public Result parse(String parameterName) {
List<Values> values = valuesProvider.getValues(parameterName);
// do other stuff on values
// ...
return valuesMapper.transformValues(values, configuration);
}
}
Я бы хотел, чтобы клиенты этой библиотеки не знали о реализациях по умолчанию ValuesProvider и ValuesMapper и использовали его как
Result result = new Parser(myConfig).parse("sampleParam");
Хотя должна быть возможность устанавливать собственные реализации при необходимости. Интересно, как и где я должен инициировать эти реализации по умолчанию и все же позволить клиентам устанавливать свои собственные, если они хотят. Я не хочу придерживаться
new DefaultValuesProvider()
и т.д.. в конструкторе, потому что реализация по умолчанию будет, например, доступ к файловой системе, так что было бы трудно проверить (макетировать их). Я знаю, что могу использовать сеттеры (как в DI), но как насчет значений по умолчанию?
EDIT:
После того, как вы ответите полностью, я думаю, что здесь лучше всего иметь сеттеры, позволяющие клиентам предоставлять свои собственные реализации ValuesProvider и ValuesMapper. Но как создать реализации по умолчанию? Я хотел бы отделить создание экземпляров от логики, поэтому я не хочу использовать новый DefaultValueProvider () здесь. Применяется ли здесь заводская модель? Если да, то как и где мне его использовать?