Как использовать больше реализаций одного интерфейса в одном классе?

Прошу помощи в решении следующей проблемы.

Существует интерфейс, который имеет больше реализаций:

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();
    }
}

Моя проблема в том, что я не хотел бы создавать новые конкретные экземпляры в методах класса, поэтому я хотел бы как-то скрыть, какая реализация используется.

Вы знаете хорошее решение для этого? Есть ли какой-нибудь шаблон дизайна, который я могу использовать? Как я могу скрыть конкретные реализации или не могу?

Спасибо за ваши ответы заранее!

Идея интерфейса заключается в том, что вызывающему классу не нужно знать реализацию. Однако в опубликованном вами коде кажется, что вызывающий класс должен знать реализацию. Итак, какой смысл иметь интерфейс?

Abra 19.05.2019 10:07

Понимаю. Я думаю, что хотел использовать интерфейс неправильно. Я просто хотел разделить функции, чтобы следовать принципу единой ответственности. Вот почему я использовал интерфейс и создал его реализации.

josamiti 19.05.2019 12:50
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
2
67
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Например, вы можете получить реализации в конструкторе 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 19.05.2019 09:52

@josamiti Вместо этого вы можете использовать List<MyInterface>.

MC Emperor 19.05.2019 10:09

Одно из возможных решений было предложено @MCEmperor. С другой стороны, вы можете реализовать шаблон Builder для создания сложного объекта. И, в конце концов, может быть, вам стоит реорганизовать свою архитектуру и разложить этот класс на несколько классов?

Golov Pavel 19.05.2019 10:18
Ответ принят как подходящий

Вы можете применить шаблон 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 вы можете кэшировать созданные объекты, если это необходимо.

Другие вопросы по теме