Я думаю, что это хороший подход и постоянно им пользуюсь. Я не испытывал никаких реальных недостатков, если бы делал это таким образом.
Примером моего использования является что-то вроде скребковой библиотеки.
У меня был бы проект Maven:
data-source-api
Имеет такой сервис, как:
package my.datasource.api;
public interface DataSource {
public GetDataResponse getData(GetDataRequest request);
}
Где GetDataRequest
и GetDataResponse
(и другие классы API) также находятся в проекте API.
А также есть проекты Maven под названием:
data-source-urlfetch-impl // for appengine
data-source-http-client-impl // for Apache HTTP client
data-source-urlconnection-impl // for appengine/vanilla Java
Для каждой из моих реализаций. E.g.:
package my.datasource.urlfetch;
public class UrlFetchDataSource implements DataSource {
...
}