DevLearn logo
Skill Up With Me
Interactive Learning
Signing in…

Фабричный метод

🔒 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