Когда вы какое-то время программировали на Go, вы начинаете распознавать некоторые шаблоны проектирования. Один из них, которым я пользуюсь уже пару месяцев, - это Заводской метод. Хотя этот шаблон проектирования может показаться несколько тривиальным, на самом деле это разумный способ скрыть детали реализации.

Как вы, возможно, уже знаете, интерфейсы в Go заставляют вас отделять действия от данных. Это делается с помощью механизма под названием Duck Typing, который должен звенеть, если вы знакомы с Python. Заводской метод позволяет объединить действия и данные в один struct и предоставить доступ только к интерфейсу.

Взгляните на этот пример кода:

Обратите внимание на следующие детали:

  • Структура, используемая для реализации, определяется как private;
  • Метод принимает параметры struct как значение вместо указателя, что означает, что мы хотим использовать его только для чтения;
  • Если реализация не соответствует интерфейсу, оператор return фабричного метода вызовет ошибку компилятора.

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

Еще одним преимуществом является то, что реализация фабричного метода облегчает внедрение зависимостей. Вы можете добавить другие интерфейсы к параметрам метода, чтобы включить их в свой личный struct. Это помогает сохранить возможность модульного тестирования кода.

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

Вот еще несколько подходящих материалов для чтения: