Какие типы данных может возвращать фабричный метод (Factory Method)?

«Какие типы данных может возвращать фабричный метод (Factory Method)?» — вопрос из категории Паттерны, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Фабричный метод (паттерн Factory Method) предназначен для создания объектов без указания их конкретных классов. Он может возвращать объекты различных типов, что является его главной силой.

Основные варианты возвращаемого типа:

  1. Абстрактный класс или интерфейс (наиболее часто)

    • Фабрика возвращает абстракцию, скрывая конкретную реализацию. Это основа принципа инверсии зависимостей (DIP).
      
      public interface Transport {
      void deliver();
      }
      public class Truck implements Transport { /*...*/ }
      public class Ship implements Transport { /*...*/ }

    public abstract class Logistics { // Фабричный метод public abstract Transport createTransport(); public void planDelivery() { Transport t = createTransport(); // Возвращает Truck или Ship t.deliver(); } }

  2. Конкретный класс

    • Используется, когда нужно инкапсулировать сложную логику создания одного типа объекта (например, используя Builder внутри).
  3. Примитив или String (редко)

    • Может применяться, если фабрика инкапсулирует логику вычисления простого значения.

Почему это важно?

  • Слабосвязанная архитектура: Клиентский код зависит от интерфейса (Transport), а не от классов Truck или Ship.
  • Гибкость и расширяемость: Добавление нового типа продукта (Plane) требует лишь создания нового конкретного создателя, не затрагивая существующий клиентский код.
  • Соблюдение принципа открытости/закрытости (OCP): Код открыт для расширения (новых продуктов), но закрыт для модификации.

Таким образом, тип возвращаемого значения определяет уровень абстракции, который фабрика предоставляет клиенту.