Factory vs Factory Method vs Abstract Factory: разница и примеры Java

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Паттерны Фабрика, Фабричный метод и Абстрактная фабрика — это ключевые шаблоны проектирования в Java, которые облегчают процесс создания объектов. Фабрика отвечает за создание объектов одним методом, определяющим нужный класс на основе параметров. Фабричный метод использует наследование и позволяет подклассам определять тип создаваемого объекта. Абстрактная фабрика управляет целыми семействами связанных объектов, не указывая их конкретные классы.

Рассмотрим примеры в коде:

Java
Скопировать код
// Фабрика
public class CarFactory {
    public static Car getCar(String type) {
        if ("SUV".equals(type)) {
            return new SUV();
        } else if ("Sedan".equals(type)) {
            return new Sedan();
        }
        throw new IllegalArgumentException("Неизвестный тип автомобиля: " + type);
    }
}

// Фабричный метод
public abstract class CarCreator {
    abstract Car createCar();

    public Car orderCar() {
        Car car = createCar();
        // Дополнительные настройки, если требуются
        return car;
    }
}

// Абстрактная Фабрика
public interface CarFactory {
    Car createSedan();
    Car createSUV();
}

Фабрику стоит выбрать для простоты и ясности, Фабричный метод – для гибкой архитектуры, а Абстрактную фабрику – для работы с комплексными семействами объектов.

Кинга Идем в IT: пошаговый план для смены профессии

Как выбрать подходящий паттерн

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

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

Для создания взаимосвязанных комплексов различных объектов используйте Абстрактную фабрику. Если ваша система напоминает сборник разрозненных фабрик, пора внести порядок с помощью абстрактной фабрики.

Аналогии из реальной жизни

Можно провести аналогию с заведениями в торговом центре:

🍔 – Закусочная (Фабрика): Вы хотите быстро перекусить и заказываете бургер в закусочной.

🍕🍝 – Итальянский ресторан (Фабричный метод): Вы хотите порадовать себя чем-то особенным и выбираете из меню итальянского ресторана разные блюда, например, пиццу или спагетти.

🍣🍱🍙 – Рынок суши (Абстрактная фабрика): Вы желаете насладиться аутентичной азиатской кухней и приходите на продуктовый рынок, где каждый стенд специализируется на определённом блюде — суши, бенто или онигири.

Таким образом, как и заведения предлагают определённый опыт, паттерны проектирования предоставляют решения для программных потребностей.

Повышение качества кода с помощью паттернов

Масштабируемость и возможность повторного использования

Фабричный метод способствует созданию масштабируемых систем, в которых новые объекты можно добавлять без изменения в клиентском коде. Абстрактная фабрика, следуя принципу открытости/закрытости, позволяет системе развиваться без нарушений.

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

Внедрение зависимостей

Абстрактная фабрика представляет собой классический способ реализации внедрения зависимостей. Этот паттерн позволяет определять интерфейсы для создания связанных объектов, освобождая зависящие от них классы от информации о конкретных реализациях.

Создание надежных структур программ

Фабрики в целом способствуют построению надежных систем:

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

Изучение реализации паттернов

Подумайте об имплементации как о моделировании реальности: фабричные методы как инструментальные наборы, а абстрактные фабрики — как полноценные предприятия.

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

Выбирайте осмысленные названия для фабрик, например, WindowFactory вместо просто Factory, чтобы избавиться от неоднозначности.

Вдохновляйтесь классическими паттернами «банды четырех», но не принимайте их за абсолютную истину — паттерны должны отвечать потребностям проекта.

Полезные материалы

  1. Обсуждение на Stack Overflow о различиях между Абстрактной Фабрикой и Фабрикой.
  2. Руководство по паттерну Фабрика на Java от DigitalOcean.
  3. Детальный анализ паттерна Абстрактная Фабрика на Java, также от DigitalOcean.
  4. Статья о применении паттернов проектирования в Java Development Kit на блоге Oracle.
  5. Практическое объяснение паттерна Фабричного метода с использованием примеров на сайте GeeksforGeeks.
  6. Руководство Baeldung по основам паттерна Абстрактная Фабрика.
  7. Примеры реализации различных паттернов на Java на ресурсе GitHub iluwatar/java-design-patterns.