Это творческий шаблон проектирования, а также один из наиболее часто используемых шаблонов.

Этот шаблон предоставляет способ создания экземпляров с использованием «фабричного» типа структуры и метод, который помогает создавать экземпляры в соответствии с предоставленными значениями и берет за основу структуру с общими атрибутами.

Пример:

Предположим, что мы разрабатываем программное обеспечение «Фабрика роботов», тогда нам нужно построить два типа роботов, робота-учителя и робота-истребителя.

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

Реализуйте фабричный метод.

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

В приведенном выше коде мы видим фабричную функцию в строке 26, эта функция вернет экземпляр «Робота» с предоставленными значениями. Затем каждый раз, когда нам нужно создать экземпляр, мы можем вызывать функцию вместо создания непосредственно со структурой.

Вывод:
Как видите, два робота были созданы с использованием фабричной функции

Реализовать абстрактную фабрику

Абстрактная фабрика определяет функцию, которая помогает нам создавать несколько объектов одного семейства, это создание выполняется с помощью вызова конкретной фабричной функции, связанной с объектом, который мы хотим создать. каждый из объектов семейства определяется структурой, и эта структура состоит из базовой структуры, определяющей свойства семейства».

Я покажу вам пример, чтобы было понятнее:

В этом первом фрагменте кода мы видим структуру, которая определяет «семейный тип», в данном случае робота (строка 18), эта структура будет использоваться каждым из «объектов». типы», которые мы хотим создать.

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

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

А вот заводское использование

Вывод

Дополнительная информация

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

Связь с другими моделями

Большинство шаблонов проектирования начинаются с реализации метода Factory, который является одним из самых простых и наиболее персонализированных, а когда проект и код разрастаются, иногда развиваются до Abstract Factory, Prototype или Builder, которые являются более гибкими, но более сложными.

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

Абстрактная фабрика может быть реализована вместо Facade Pattern, когда нам просто нужно скрыть создание объекта.

Фабричный метод может служить ступенькой к более широкому шаблонному методу.

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

За и против

  • Избегайте сильного якоря между создателем и конкретными продуктами.
  • Принцип единой ответственности. Вы можете переместить код создания продукта в место в программе, чтобы упростить его обслуживание.
  • Принцип открыто-закрыто. Вы можете включать в программу новые типы продуктов, не нарушая существующий клиентский код.
  • Вы можете быть уверены, что продукты, которые вы получаете с завода, совместимы друг с другом.

  • Может случиться так, что код усложнится, поскольку вам придется включать множество структур и композиций для реализации шаблона. Идеальной ситуацией было бы вставить шаблон в существующую иерархию структур-создателей.

Примечание:
Эта статья относится к серии Шаблоны проектирования в Голанге, которые вы можете найти здесь https://blog.devgenius.io/desing-patters-in-golang-1b03de4fb89.