Обычно, когда вы выставляете свой API, вы должны как можно больше скрывать детали реализации и раскрывать его через простые интерфейсы.
Например, Предположим, что вы даете API для добавления двух чисел.
Soln1 (Bad soln) Предоставить клиенту следующий класс
public class Adder {
public void setA() {..}
public void setB() {..}
public int add() { return A + B; }
}
Soln 2 (лучше soln): предоставить клиенту следующий интерфейс.
public interface Adder {
public int add(int a, int b);
}
Теперь почему soln 2 - лучшее решение. Если бы вы дали пользователю первый солнц. Клиент привязан к классу Adder. Предположим, позже у вас будет новая реализация дополнения, которая может добавлять числа в облаке (чрезмерно воображаемо :)), вам, возможно, придется как клиенту изменить свой код, чтобы использовать новый класс.
Вместо этого, если вы просто дадите им интерфейс, вы можете обеспечить множество реализаций и иметь фабричный механизм для выбора подходящей реализации.