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.