В программировании шаблоны (или паттерны) проектирования являются обобщёнными решениями для часто встречающихся проблем. Их использование способствует повышению уровня абстракции в проектах и облегчает поддержку и расширение кода [1].
Паттерн проектирования "Абстрактная фабрика" играет ключевую роль в разработке программного обеспечения, предоставляя интерфейс для создания семейств взаимосвязанных или взаимозависимых объектов без спецификации их конкретных классов. Это позволяет программе быть более гибкой в выборе объектов для создания во время выполнения. Данный паттерн относится к категории порождающих паттернов, так как он занимается созданием экземпляров объектов.
Цель Абстрактной фабрики заключается в обеспечении интерфейса для создания семейств связанных объектов, не привязываясь к конкретным классам создаваемых объектов. Это позволяет коду программы работать с разными семействами объектов, изменяя лишь конкретные фабрики, не изменяя код, который использует эти объекты. Такой подход облегчает добавление новых семейств объектов в программу и повышает ее модульность.
Рассмотрим пример использования паттерна "Абстрактная фабрика". Представим, что разрабатывается программа для создания графического интерфейса, которая должна работать как на Windows, так и на macOS. В таком случае можно определить абстрактную фабрику GUIFactory, которая будет иметь методы для создания элементов интерфейса, например, кнопок и чекбоксов.
Пример представлен нарисунке 1.

Рисунок 1. Пример создания паттерна
В данном примере GUIFactory является интерфейсом абстрактной фабрики, предоставляющим метод для создания объектов типа Button. MacOSFactory и WindowsFactory– конкретные фабрики, реализующие этот интерфейс и создающие объекты соответствующих структур. Функция ClientCode демонстрирует, как клиентский код может использовать фабрику для создания объектов без знания о конкретных типах этих объектов.
Особенности реализации в Go.
В Go паттерн "Абстрактная фабрика" реализуется с помощью интерфейсов и структур, что отличается от реализации в объектно-ориентированных языках с классами:
Интерфейсы вместо абстрактных классов – в Go интерфейсы определяют контракт, который должны выполнять конкретные типы. Любой тип, реализующий все методы интерфейса, автоматически удовлетворяет этому интерфейсу без явного объявления наследования.
Структуры вместо классов – конкретные реализации продуктов и фабрик представлены структурами.
Композиция над наследованием – Go следует принципу "композиция над наследованием". Вместо иерархии классов используется встраивание структур и реализация интерфейсов, что обеспечивает большую гибкость и простоту.
В контексте паттерна проектирования Абстрактная фабрика, использование интерфейсов в Go помогает определить шаблон для создания семейств взаимосвязанных или взаимозависимых объектов, при этом не специфицируя их конкретные типы. Это дает возможность изменять и расширять семейства продуктов без изменения кода, который использует эти продукты [2].
Паттерн "Абстрактная фабрика" предоставляет мощный инструмент для создания семейств взаимосвязанных или взаимозависимых объектов без конкретизации их типов. Это способствует созданию гибкого и модульного кода. В Go этот паттерн реализуется с помощью интерфейсов и структур, что соответствует идиомам языка и принципу "композиция над наследованием".
Список литературы
- Донован А., Kernighan B. Язык программирования Go [Текст] / А. Донован, Б. Керниган. – М.: Вильямс, 2016. – 480 с.
- Цукалос М. Go: идиомы и паттерны проектирования [Текст] / М. Цукалос. – СПб.: Питер, 2020. – 544 с.


