Перейти к основному содержимому

Что это такое

Паттерн Фабричный метод (Factory Method) прячет создание объекта за функцией. Вызывающий код говорит, что ему нужно, — а фабрика решает, какой конкретный класс создать, и возвращает его.

Вызывающий код никогда не обращается к конкретным классам напрямую, поэтому новые виды можно добавлять, не меняя вызывающий код. В Python это просто функция new_something(), которая возвращает протокол.


Пример: фабрика хранилищ

new_storage("disk") и new_storage("memory") возвращают разные конкретные классы за одним и тем же протоколом Storage — вызывающий код не видит разницы, и ему это не нужно.

Фабрика выбирает класс

Конструкция match по видам находится в одном месте — в фабрике. Остальная программа знает только протокол.

Prompt
Напишите программу на Python с протоколом Storage (метод save), классами DiskStore и MemoryStore и фабричной функцией new_storage, которая возвращает нужный класс по строке вида. Создайте оба вида через фабрику, сохраните заказ с помощью каждого и выведите результаты.
Вывод: полная программа на Python

Когда его использовать

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

Не используйте его, когда есть только одна реализация и вторая не предвидится. Для store = DiskStore() фабрика не нужна.


Плюсы и минусы

Плюсы: логика создания находится в одном месте; вызывающий код зависит только от протокола; добавление нового вида затрагивает только фабрику.

Минусы: ещё один уровень, через который нужно читать код; при единственной реализации это пустая формальность.