我正在研究一種參數值解析器庫。我想有一個解析器定義如下:可配置的依賴關係,容易模擬默認實現
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()
等在構造函數,因爲默認實現將例如,訪問文件系統,這樣就很難測試(將它們模擬出來)。我知道我可以使用setter(比如DI),但是默認值是什麼?
編輯: 在你的所有答案後,我想最好在這裏讓setter允許客戶端提供他們自己的ValuesProvider和ValuesMapper的實現。但是如何創建默認實現?我想解耦來自邏輯的實例,所以我不想在這裏使用新的DefaultValueProvider()。工廠模式在這裏適用嗎?如果是這樣的話,我應該在哪裏使用它?
相關:stackoverflow.com/questions/2045904/dependency-inject-di友好型圖書館/ 2047657#2047657 –