Бесплатный вебинар
«как найти любимую работу»
Подарки на 150 000 ₽ за участие
Живой эфир
Записи не будет!
00:00:00:00
дн.ч.мин.сек.

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

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

Паттерны Фабрика, Фабричный метод и Абстрактная фабрика — это ключевые шаблоны проектирования в 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: пошаговый план для смены профессии

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Подробнее об этом расскажет наш спикер на видео
skypro youtube speaker

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

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

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

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

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

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

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

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

Выбирайте осмысленные названия для фабрик, например, 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.
Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей
Какой паттерн лучше всего подходит для создания семейства связанных объектов?
1 / 5