Sobes.tech
Junior

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

sobes.tech АИ

Одговор од АИ

Познат сам са различитим шабонима дизајна који се користе у 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) {
    	// Реализација стратегије А
    }
    
    type ConcreteStrategyB struct{}
    
    func (s *ConcreteStrategyB) Execute(data string) {
    	// Реализација стратегије Б
    }
    
    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-у се такође често користе идиоми језика, као што су употреба интерфејса за апстракцију, горутина и канала за паралелизам.