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

Что это такое

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

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


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

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

Фабрика выбирает тип

Переключение по видам находится в одном месте — в фабрике. Остальная часть программы знает только про интерфейс.

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

Когда его применять

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

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


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

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

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