Sobes.tech
Junior

С кои шаблони за дизайн сте запознати?

sobes.tech AI

Отговор от 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
    }
    
  • Фабричен метод: Определя интерфейс за създаване на обект, но подкласовете решават кой клас да инстанцират. В 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 // или грешка
    	}
    }
    
  • Абстрактна фабрика: Предоставя интерфейс за създаване на семейства от свързани или зависими обекти без да се уточняват техните конкретни класове.
  • 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)
    }
    
  • Шаблонен метод: Определя скелета на алгоритъм в операция, прехвърляйки някои стъпки към подкласове. Позволява на подкласовете да преназначават определени стъпки на алгоритъма, без да променят неговата структура.

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