Sobes.tech
Junior

S jakými návrhovými vzory jste obeznámen?

sobes.tech AI

Odpověď od AI

Seznám se s různými návrhovými vzory používanými v Go. Některé z nejčastějších jsou:

Vytvářecí vzory:

  • Singleton: Zajišťuje, že existuje pouze jedna instance třídy a poskytuje k ní globální přístupový bod. V Go je často implementován pomocí 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: Definuje rozhraní pro vytváření objektu, ale podtřídy rozhodují, kterou třídu instancovat. V Go je často implementován pomocí funkcí vracejících rozhraní.
    package main
    
    type Product interface {
    	Operate()
    }
    
    type ConcreteProductA struct{}
    
    func (p *ConcreteProductA) Operate() {
    	// Implementace operace
    }
    
    type ConcreteProductB struct{}
    
    func (p *ConcreteProductB) Operate() {
    	// Implementace operace
    }
    
    func NewProduct(productType string) Product {
    	switch productType {
    	case "A":
    		return &ConcreteProductA{}
    	case "B":
    		return &ConcreteProductB{}
    	default:
    		return nil // nebo chyba
    	}
    }
    
  • Abstraktní továrna: Poskytuje rozhraní pro vytváření rodin souvisejících nebo závislých objektů bez určení jejich konkrétních tříd.
  • Builder: Odděluje proces sestavení složitého objektu od jeho reprezentace.

Strukturální vzory:

  • Adapter: Převádí rozhraní jedné třídy na jiné, požadované klienty. Umožňuje třídám spolupracovat, které by jinak byly nekompatibilní.
  • Decorator: Dynamicky přidává nové odpovědnosti objektu. Dekorátory poskytují flexibilní alternativu k dědičnosti pro rozšíření funkčnosti.
  • Facade: Poskytuje sjednocené rozhraní k sadě rozhraní v podsystému. Definuje vyšší úroveň rozhraní, které usnadňuje použití podsystému.
  • Proxy: Působí jako náhrada nebo zástupce jiného objektu pro řízení přístupu k němu.

Chování vzory:

  • Observer: Definuje závislost "jeden ku mnoha" mezi objekty. Při změně stavu jednoho objektu jsou všechny závislé objekty upozorněny a automaticky aktualizovány.
  • Strategy: Definuje rodinu algoritmů, kapsuluje je a činí je zaměnitelnými. Umožňuje algoritmům měnit se nezávisle na klientech, kteří je používají.
    package main
    
    type Strategy interface {
    	Execute(data string)
    }
    
    type ConcreteStrategyA struct{}
    
    func (s *ConcreteStrategyA) Execute(data string) {
    	// Implementace strategie A
    }
    
    type ConcreteStrategyB struct{}
    
    func (s *ConcreteStrategyB) Execute(data string) {
    	// Implementace strategie 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)
    }
    
  • Šablona metody: Definuje kostru algoritmu v operaci, odkládá některé kroky na podtřídy. Umožňuje podtřídám předefinovat určité kroky algoritmu, aniž by měnily jeho strukturu.

Kromě toho znám vzory jako Command, Chain of Responsibility, Iterator, Mediator, Memento, State, Visitor. V Go se také často používají idiomy jazyka, například použití rozhraní pro abstrakci, gorutin a kanálů pro paralelismus.