Назад к вопросам
Junior
209
questionbank

С какими паттернами проектирования вы знакомы?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Я знаком с различными паттернами проектирования, которые используются в Go. Некоторые из наиболее часто встречающихся:

Порождающие паттерны:

  • Singleton: Обеспечивает существование только одного экземпляра класса и предоставляет глобальную точку доступа к нему. В Go часто реализуется с помощью sync.Once.
    package main
    
    import (
    	"sync"
    )
    
    type singleton struct{}
    
    var instance *singleton
    var once sync.Once
    
    func GetInstance() *singleton {
    	once.Do(func() {
    		instance = &singleton{}
    	})
    	return instance
    }
    
  • Factory Method: Определяет интерфейс для создания объекта, но позволяет подклассам решать, какой класс инстанцировать. В Go часто реализуется с использованием функций, возвращающих интерфейс.
    package main
    
    type Product interface {
    	Operate()
    }
    
    type ConcreteProductA struct{}
    
    func (p *ConcreteProductA) Operate() {
    	// Реализация операции
    }
    
    type ConcreteProductB struct{}
    
    func (p *ConcreteProductB) Operate() {
    	// Реализация операции
    }
    
    func NewProduct(productType string) Product {
    	switch productType {
    	case "A":
    		return &ConcreteProductA{}
    	case "B":
    		return &ConcreteProductB{}
    	default:
    		return nil // Или ошибка
    	}
    }
    
  • Abstract Factory: Предоставляет интерфейс для создания семейств связанных или зависимых объектов без указания их конкретных классов.
  • Builder: Разделяет процесс конструирования сложного объекта от его представления.

Структурные паттерны:

  • Adapter: Преобразует интерфейс одного класса в другой, требуемый клиентам. Позволяет классам работать вместе, иначе несовместимым.
  • Decorator: Динамически добавляет новые обязанности объекту. Декораторы предоставляют гибкую альтернативу наследованию для расширения функциональности.
  • Facade: Предоставляет унифицированный интерфейс к набору интерфейсов в подсистеме. Определяет высокоуровневый интерфейс, который облегчает использование подсистемы.
  • Proxy: Предоставляет заменитель или заполнитель для другого объекта для управления доступом к нему.

Поведенческие паттерны:

  • Observer: Определяет зависимость "один ко многим" между объектами. При изменении состояния одного объекта все его зависимые объекты уведомляются и автоматически обновляются.
  • Strategy: Определяет семейство алгоритмов, инкапсулирует каждый из них и делает их взаимозаменяемыми. Позволяет алгоритмам изменяться независимо от клиентов, которые их используют.
    package main
    
    type Strategy interface {
    	Execute(data string)
    }
    
    type ConcreteStrategyA struct{}
    
    func (s *ConcreteStrategyA) Execute(data string) {
    	// Реализация стратегии A
    }
    
    type ConcreteStrategyB struct{}
    
    func (s *ConcreteStrategyB) Execute(data string) {
    	// Реализация стратегии B
    }
    
    type Context struct {
    	strategy Strategy
    }
    
    func (c *Context) SetStrategy(strategy Strategy) {
    	c.strategy = strategy
    }
    
    func (c *Context) ExecuteStrategy(data string) {
    	c.strategy.Execute(data)
    }
    
  • Template Method: Определяет каркас алгоритма в операции, перенося некоторые шаги на подклассы. Позволяет подклассам переопределять определенные шаги алгоритма, не изменяя его структуру.

Помимо перечисленных, знаком с такими паттернами как Command, Chain of Responsibility, Iterator, Mediator, Memento, State, Visitor. В Go также часто используются идиомы проектирования, специфичные для языка, например, применение интерфейсов для абстракции, горутин и каналов для параллелизма.