Прошу помощи в решении следующей проблемы.
Существует интерфейс, который имеет больше реализаций:
public interface MyInterface {
void method();
}
public class MyInterfaceA implements MyInterface
public class MyInterfaceB implements MyInterface
и есть класс, который использует эти реализации интерфейса в своих разных методах:
public class MyClass {
public void firstMethod() {
new MyInterfaceA().method();
}
public void secondMethod() {
new MyInterfaceB().method();
}
}
Моя проблема в том, что я не хотел бы создавать новые конкретные экземпляры в методах класса, поэтому я хотел бы как-то скрыть, какая реализация используется.
Вы знаете хорошее решение для этого? Есть ли какой-нибудь шаблон дизайна, который я могу использовать? Как я могу скрыть конкретные реализации или не могу?
Спасибо за ваши ответы заранее!
Понимаю. Я думаю, что хотел использовать интерфейс неправильно. Я просто хотел разделить функции, чтобы следовать принципу единой ответственности. Вот почему я использовал интерфейс и создал его реализации.




Например, вы можете получить реализации в конструкторе MyClass и в дальнейшем использовать его. Это поможет вам скрыть конкретные реализации.
public class MyClass {
private MyInterface one;
private MyInterface two;
private MyClass(MyInterface one, MyInterface two) {
this.one = one;
this.two = two;
}
public void firstMethod() {
one.method();
}
public void secondMethod() {
two.method();
}
}
К сожалению, количество методов и количество реализаций интерфейса может расти. Таким образом, это означает, что конструктор может стать конструктором множества параметров. Я не хочу использовать конструктор с большим количеством параметров. Кстати, спасибо за ваш ответ.
@josamiti Вместо этого вы можете использовать List<MyInterface>.
Одно из возможных решений было предложено @MCEmperor. С другой стороны, вы можете реализовать шаблон Builder для создания сложного объекта. И, в конце концов, может быть, вам стоит реорганизовать свою архитектуру и разложить этот класс на несколько классов?
Вы можете применить шаблон Factory:
class Factory {
public MyInterface a() { return new MyInterfaceA(); }
public MyInterface b() { return new MyInterfaceB(); }
}
public class MyClass {
private Factory factory;
public MyClass(Factory factory) { this.factory = factory; }
public void firstMethod() {
factory.a().method();
}
public void secondMethod() {
factory.b().method();
}
}
Внутри класса Factory вы можете кэшировать созданные объекты, если это необходимо.
Идея интерфейса заключается в том, что вызывающему классу не нужно знать реализацию. Однако в опубликованном вами коде кажется, что вызывающий класс должен знать реализацию. Итак, какой смысл иметь интерфейс?