Вопрос с собеседования · Java

Какую задачу решают порождающие паттерны?

JuniorПаттерны проектирования
Ещё спрашивают так:
  • Какие порождающие паттерны вы знаете?
  • Что такое Builder и Factory?
  • Чем плох Singleton?
Коротко

Порождающие паттерны отделяют клиента от конкретных классов создаваемых объектов: создание прячут за фабрикой или билдером.

  • Factory Method, Abstract Factory, Builder, Prototype, Singleton
  • Builder — для объектов с многими параметрами; фабрика — выбор реализации в одном месте

А ещё Singleton — глобальное состояние: мешает тестам; в Spring его роль играет бин

Подробно

Прямой new ConcreteClass() в коде жёстко связывает его с конкретной реализацией: заменить её или подставить заглушку в тесте трудно. Порождающие паттерны выносят создание в отдельное место.

  • Factory Method / статическая фабрика — метод решает, какой объект создать: List.of(...), Executors.newFixedThreadPool(...).
  • Abstract Factory — семейство связанных объектов: фабрика компонентов интерфейса для разных платформ.
  • Builder — пошаговое создание объекта с многими параметрами, часть из которых необязательна. Читается лучше конструктора с десятью аргументами: HttpRequest.newBuilder().uri(...).timeout(...).build().
  • Prototype — создание копированием готового объекта.
  • Singleton — единственный экземпляр класса. Самый спорный: по сути глобальное состояние, скрытые зависимости, трудно тестировать. В приложениях на Spring эту роль выполняют бины-синглтоны, которые внедряются явно.

Две другие группы GoF-паттернов: структурные (как объекты собираются в конструкции) и поведенческие (как распределяются обязанности).

Пример

Pizza pizza = Pizza.builder()
        .size(Size.LARGE)
        .addTopping("cheese")
        .addTopping("mushrooms")
        .build();

Что хотят услышать

  • Задача группы: отделить клиента от конкретных классов.
  • Несколько паттернов с примерами, особенно Builder и фабрика.
  • Критика Singleton — плюс.
  • Знание трёх групп паттернов.

Частые ошибки

  • Применять паттерн там, где достаточно обычного конструктора.
  • Путать три группы паттернов между собой.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✗Описывают, как объекты обмениваются сообщениями между собой
  • ✗Определяют способ объединения объектов в более крупные структуры
  • ✗Управляют жизненным циклом потоков выполнения
  • ✓Отвязывают клиента от конкретных создаваемых классов

Что спросят дальше

  • Чем фабричный метод отличается от статической фабрики?
  • Зачем нужен билдер при создании неизменяемых объектов?

Разбор темы

Связанные вопросы

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования