Фабричный метод и анонимные классы

100
19 октября 2019, 17:10

Разбираюсь с абстрактными классами в java и в качестве примера их использования приводиться фабричный метод, и говориться что в данном случае мы можем не создавать именованный экземпляр класса что собственно делает синтаксис более осмысленным, вот пример кода:

interface Service{
  void method1();
  void method2();
}
interface ServiceFactory{
  Service getService();
}
class Implementation1 implements Service{
  private Implementation1(){
  }
  public void method1(){
    System.out.println("Implementetion1 print method1");
  }
  public void method2(){
    System.out.println("Implementetion1 print method2");
  }
  public static ServiceFactory factory =
    new ServiceFactory(){
      public Service getService(){
        return new Implementation1();
      }
    };
}
class Implementation2 implements Service{
  private Implementation2(){
  }
  public void method1(){
    System.out.println("Implementetion2 print method1");
  }
  public void method2(){
    System.out.println("Implementetion2 print method2");
  }
  public static ServiceFactory factory =
    new ServiceFactory() {
      @Override
      public Service getService() {
        return new Implementation2();
      }
    };
}
class  Factories{
  public static void serviceConsumer(ServiceFactory fact){
    Service s = fact.getService();
    s.method1();
    s.method2();
  }
}
public class AbstractClass {
  public static void main(String[] arg){
    Factories.serviceConsumer(Implementation1.factory);
    Factories.serviceConsumer(Implementation2.factory);
  }
}

Не понятно, чем это лучше на практике чем следующий код:

interface Service{
  void method1();
  void method2();
}
class Implementation1 implements Service{
  public void method1(){
    System.out.println("Implementetion1 print method1");
  }
  public void method2(){
    System.out.println("Implementetion1 print method2");
  }
}
class Implementation2 implements Service{
  public void method1(){
    System.out.println("Implementetion2 print method1");
  }
  public void method2(){
    System.out.println("Implementetion2 print method2");
  }
}
class  Factories{
  public static void serviceConsumer(Service s){
    s.method1();
    s.method2();
  }
}
public class AbstractClass {
  public static void main(String[] arg){
    Factories.serviceConsumer(new Implementation1());
    Factories.serviceConsumer(new Implementation2());
  }
}

В первом случае в Factories.serviceConsumer мы передает конкретное поле конкретного класса, почему бы не передавать сразу объект как во втором случае, к тому же во втором случае кода нужно писать меньше.

Answer 1

В первом случае в Factories.serviceConsumer мы передает конкретное поле конкретного класса, почему бы не передавать сразу объект как во втором случае

Чтобы сразу передать объект, как во втором случае, нужно сначала его создать и проинициализировать, в вашем пример это просто вызов конструктора, но на практике это может быть сложная процедура, с различной логикой для различных реализаций Service, так что если эту логику отдать клиентскому классу (AbstractClass), то получим сильную связь между этими классами, что в дальнейшем будет дорого поддерживать.

Фабричный метод как раз позволяет делегировать создание объекта другому классу, а клиентский класс не должен ничего знать о том, как создавать тот или иной экземпляр сервиса.

READ ALSO
Spring Data JPA закрывается соеденение с БД

Spring Data JPA закрывается соеденение с БД

Имеется Spring boot приложение, которое перегоняет большое количество данных получаемых по API в удаленную БД (MySQL)В качестве пула соединений использую...

141
Сигнатура конструктора в интерфейсе

Сигнатура конструктора в интерфейсе

Почему нельзя в интерфейсе задать сигнатуру конструктора без реализации?

119
При использовании Spring Data JpaRepository настройки через JavaConfig, вылетает NoSuchBeanDefinitionException

При использовании Spring Data JpaRepository настройки через JavaConfig, вылетает NoSuchBeanDefinitionException

Уже неделю голову ломаю, вроде всё так и всё на месте, но что-то не вижу, подскажите, пожалуйста, что не учёл

120
Перемещение isp файла за пределы папки web

Перемещение isp файла за пределы папки web

Начал осваивать сервлеты и столкнулся с таким вопросом Файлы jsp лежат в папке web Можно ли их вынести в папку src например? И стоит ли во вьюшку...

105