Ответ
Паттерны GoF (Gang of Four, "Банда четырех") — это 23 классических шаблона проектирования, описанных в книге "Design Patterns: Elements of Reusable Object-Oriented Software". Авторы: Эрих Гамма, Ричард Хелм, Ральф Джонсон и Джон Влиссидес.
Эти паттерны предлагают проверенные решения для часто встречающихся проблем в проектировании ПО и делятся на 3 категории:
- Порождающие (Creational): Отвечают за гибкое создание объектов.
Примеры: Singleton, Factory Method, Builder. - Структурные (Structural): Определяют, как из объектов формировать более крупные структуры.
Примеры: Adapter, Decorator, Facade. - Поведенческие (Behavioral): Определяют алгоритмы и способы взаимодействия между объектами.
Примеры: Strategy, Observer, Command.
Применимость в Go
Хотя паттерны были описаны для ООП-языков с классами (C++, Java), их идеи универсальны. В Go они реализуются с учетом идиом языка:
- Композиция вместо наследования: Go поощряет встраивание структур (embedding) для расширения функциональности, что является альтернативой наследованию.
- Интерфейсы: Широко используются для реализации полиморфизма и инверсии зависимостей. Например, паттерн "Стратегия" легко реализуется через интерфейс, который определяет метод, а разные структуры реализуют его по-своему.
- Функции как объекты первого класса: Функции можно передавать как аргументы, что упрощает реализацию многих поведенческих паттернов (например, "Стратегия" или "Команда") без необходимости создавать отдельные классы/структуры.
Пример: Singleton в Go с использованием sync.Once
package main
import "sync"
type singleton struct {
// поля структуры
}
var instance *singleton
// sync.Once гарантирует, что функция в Do() выполнится только один раз
// за все время жизни программы, что делает его идеальным для потокобезопасного синглтона.
var once sync.Once
func GetInstance() *singleton {
once.Do(func() {
instance = &singleton{}
})
return instance
}