Sobes.tech
Junior

S akými návrhovými vzormi ste oboznámený?

sobes.tech AI

Odpoveď od AI

Som oboznámený s rôznymi návrhovými vzormi používanými v Go. Niektoré z najčastejšie používaných sú:

Vytváracie vzory:

  • Singleton: Zabezpečuje, že existuje iba jedna inštancia triedy a poskytuje k nej globálny prístupový bod. V Go sa často implementuje pomocou 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
    }
    
  • Funkcia továreň: Definuje rozhranie na vytváranie objektu, ale podtriedy rozhodujú, ktorú triedu inštancovať. V Go sa často realizuje pomocou funkcií, ktoré vracajú rozhranie.
    package main
    
    type Product interface {
    	Operate()
    }
    
    type ConcreteProductA struct{}
    
    func (p *ConcreteProductA) Operate() {
    	// Implementácia operácie
    }
    
    type ConcreteProductB struct{}
    
    func (p *ConcreteProductB) Operate() {
    	// Implementácia operácie
    }
    
    func NewProduct(productType string) Product {
    	switch productType {
    	case "A":
    		return &ConcreteProductA{}
    	case "B":
    		return &ConcreteProductB{}
    	default:
    		return nil // alebo chyba
    	}
    }
    
  • Abstraktná továreň: Poskytuje rozhranie na vytváranie rodín súvisiacich alebo závislých objektov bez špecifikácie ich konkrétnych tried.
  • Builder: Oddelí proces konštrukcie zloženého objektu od jeho reprezentácie.

Štrukturálne vzory:

  • Adapter: Konvertuje rozhranie jednej triedy na iné, požadované klientmi. Umožňuje spoluprácu tried, ktoré by inak boli nekompatibilné.
  • Decorator: Dynamicky pridáva nové zodpovednosti k objektu. Dekorátory poskytujú flexibilnú alternatívu k dedičstvu na rozšírenie funkčnosti.
  • Facade: Poskytuje zjednotený rozhranie k množine rozhraní v podsystéme. Definuje vysokú úroveň rozhrania, ktoré uľahčuje používanie podsystému.
  • Proxy: Pôsobí ako náhrada alebo zástupca iného objektu na riadenie prístupu k nemu.

Behaviorálne vzory:

  • Observer: Definuje závislosť "jeden ku mnohým" medzi objektmi. Pri zmene stavu jedného objektu sú všetky závislé objekty upozornené a automaticky aktualizované.
  • Strategy: Definuje rodinu algoritmov, kapsuluje ich a robí ich zamieňateľnými. Umožňuje meniť algoritmy nezávisle od klientov, ktorí ich používajú.
    package main
    
    type Strategy interface {
    	Execute(data string)
    }
    
    type ConcreteStrategyA struct{}
    
    func (s *ConcreteStrategyA) Execute(data string) {
    	// Implementácia stratégie A
    }
    
    type ConcreteStrategyB struct{}
    
    func (s *ConcreteStrategyB) Execute(data string) {
    	// Implementácia stratégie 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)
    }
    
  • Šablónový spôsob: Definuje kostru algoritmu v operácii, odkladajúci niektoré kroky na podtriedy. Umožňuje podtriedam redefinovať určité kroky algoritmu bez zmeny jeho štruktúry.

Okrem toho som oboznámený s vzormi ako Command, Chain of Responsibility, Iterator, Mediator, Memento, State, Visitor. V Go sa tiež často používajú idiomy jazyka, ako je použitie rozhraní na abstrakciu, gorutiny a kanály na paralelizáciu.