Что такое паттерны проектирования GoF и как они применимы в Go?

Ответ

Паттерны GoF (Gang of Four, "Банда четырех") — это 23 классических шаблона проектирования, описанных в книге "Design Patterns: Elements of Reusable Object-Oriented Software". Авторы: Эрих Гамма, Ричард Хелм, Ральф Джонсон и Джон Влиссидес.

Эти паттерны предлагают проверенные решения для часто встречающихся проблем в проектировании ПО и делятся на 3 категории:

  1. Порождающие (Creational): Отвечают за гибкое создание объектов.

    Примеры: Singleton, Factory Method, Builder.
  2. Структурные (Structural): Определяют, как из объектов формировать более крупные структуры.

    Примеры: Adapter, Decorator, Facade.
  3. Поведенческие (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
}