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.