Factory vs Factory Method vs Abstract Factory: разница и примеры 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();
}
Фабрику стоит выбрать для простоты и ясности, Фабричный метод – для гибкой архитектуры, а Абстрактную фабрику – для работы с комплексными семействами объектов.
Как выбрать подходящий паттерн
Паттерн Фабрика подходит, когда требуется создать объект, при этом логика выбора типа не особенно сложна — речь идёт о простом вводе-выводе данных.
Фабричный метод может быть полезен, если в проекте много подклассов одного суперкласса — он помогает сохранить код чистым и позволяет вводить новые типы объектов без изменения клиентского кода.
Для создания взаимосвязанных комплексов различных объектов используйте Абстрактную фабрику. Если ваша система напоминает сборник разрозненных фабрик, пора внести порядок с помощью абстрактной фабрики.
Аналогии из реальной жизни
Можно провести аналогию с заведениями в торговом центре:
🍔 – Закусочная (Фабрика): Вы хотите быстро перекусить и заказываете бургер в закусочной.
🍕🍝 – Итальянский ресторан (Фабричный метод): Вы хотите порадовать себя чем-то особенным и выбираете из меню итальянского ресторана разные блюда, например, пиццу или спагетти.
🍣🍱🍙 – Рынок суши (Абстрактная фабрика): Вы желаете насладиться аутентичной азиатской кухней и приходите на продуктовый рынок, где каждый стенд специализируется на определённом блюде — суши, бенто или онигири.
Таким образом, как и заведения предлагают определённый опыт, паттерны проектирования предоставляют решения для программных потребностей.
Повышение качества кода с помощью паттернов
Масштабируемость и возможность повторного использования
Фабричный метод способствует созданию масштабируемых систем, в которых новые объекты можно добавлять без изменения в клиентском коде. Абстрактная фабрика, следуя принципу открытости/закрытости, позволяет системе развиваться без нарушений.
Паттерны проектирования увеличивают возможность повторного использования кода. Фабрика и Фабричный метод инкапсулируют процесс создания объектов и уменьшают избыточность.
Внедрение зависимостей
Абстрактная фабрика представляет собой классический способ реализации внедрения зависимостей. Этот паттерн позволяет определять интерфейсы для создания связанных объектов, освобождая зависящие от них классы от информации о конкретных реализациях.
Создание надежных структур программ
Фабрики в целом способствуют построению надежных систем:
- Фабрики скрывают детали создания объектов, упрощая инстанцирование.
- Абстрактные фабрики обеспечивают создание совместимых продуктов, способствуя консистентности.
- Фабричный метод передает ответственность за создание объектов подклассам, что увеличивает гибкость.
Изучение реализации паттернов
Подумайте об имплементации как о моделировании реальности: фабричные методы как инструментальные наборы, а абстрактные фабрики — как полноценные предприятия.
Фабрики важны для обеспечения модульности: они централизуют создание объектов, минимизируют зависимости и соответствуют принципу единственной ответственности.
Выбирайте осмысленные названия для фабрик, например, WindowFactory
вместо просто Factory
, чтобы избавиться от неоднозначности.
Вдохновляйтесь классическими паттернами «банды четырех», но не принимайте их за абсолютную истину — паттерны должны отвечать потребностям проекта.
Полезные материалы
- Обсуждение на Stack Overflow о различиях между Абстрактной Фабрикой и Фабрикой.
- Руководство по паттерну Фабрика на Java от DigitalOcean.
- Детальный анализ паттерна Абстрактная Фабрика на Java, также от DigitalOcean.
- Статья о применении паттернов проектирования в Java Development Kit на блоге Oracle.
- Практическое объяснение паттерна Фабричного метода с использованием примеров на сайте GeeksforGeeks.
- Руководство Baeldung по основам паттерна Абстрактная Фабрика.
- Примеры реализации различных паттернов на Java на ресурсе GitHub iluwatar/java-design-patterns.