Фабричный метод
🔒 Sign in to use this
Фабричный метод — это порождающий паттерн проектирования, который определяет интерфейс для создания объекта, но позволяет подклассам решать, какой класс инстанциировать. Вместо прямого вызова конструктора через new вы вызываете фабричный метод — а подкласс определяет конкретный тип.
ℹ️Ключевая идея: делегировать создание объектов подклассам. Класс-создатель объявляет фабричный метод; каждый конкретный создатель переопределяет его для производства конкретного продукта.
Проблема, которую он решает
Представьте, что вы разрабатываете логистическое приложение. Изначально оно работает только с грузовиками. Вы хардкодите new Truck() везде. Затем бизнес требует морскую доставку. Теперь нужно менять каждое место создания транспорта. Фабричный метод позволяет изолировать логику создания: добавление нового типа транспорта требует лишь нового подкласса.
Кликните, чтобы анимировать поток создания ▶
🏭
Creator
объявляет createTransport()
→
🔧
Factory Method
переопределяется подклассом
→
📦
Concrete Creator
TruckLogistics
→
🚚
Product
Truck : Transport
Структура
Кликните на роль, чтобы узнать, что она делает
📐
Product
🚚
Concrete Product
🏭
Creator
🔧
Concrete Creator
Пример кода
java
// Product interface
interface Transport {
void deliver();
}
// Concrete Products
class Truck implements Transport {
@Override
public void deliver() {
System.out.println("Delivering by land in a truck");
}
}
class Ship implements Transport {
@Override
public void deliver() {
System.out.println("Delivering by sea in a container ship");
}
}Пошагово: что происходит во время выполнения
Кликните на каждый шаг, чтобы увидеть подробности
Конфиг
1
Creator
2
planDelivery()
3
createTransport()
4
deliver()
5
Когда применять Фабричный метод
Кликните, чтобы раскрыть каждый сценарий
❓
Неизвестный тип на этапе проектирования
🔌
Расширение библиотеки
♻️
Повторное использование объектов
⚠️Компромисс: Фабричный метод может привести к появлению множества параллельных иерархий подклассов — ConcreteCreator для каждого ConcreteProduct. Если иерархия разрастается, рассмотрите Абстрактную фабрику или Прототип.
Фабричный метод в стандартной библиотеке Java
Кликните на выделенные строки, чтобы увидеть паттерн в действии
java
1
// java.util.Collection — iterator() является фабричным методом
2
List<String> list = new ArrayList<>();
▼
3
Iterator<String> it = list.iterator();
▼
4
5
// java.nio.file.Files — статические фабричные методы
6
Path path = Path.of("/tmp/file.txt");▼
7
8
// java.util.Calendar
9
Calendar cal = Calendar.getInstance();
▼
✅Ключевой вывод: Фабричный метод поддерживает принцип открытости/закрытости — вы можете добавлять новые типы продуктов (новый транспорт) без изменения существующего кода создателя (Logistics.planDelivery).
🔒 Sign in to use this