Middle
Povedzte o návrhovom vzore 'Staviteľ'.
sobes.tech AI
Odpoveď od AI
Vzor návrhu "Staviteľ" (Builder) je tvorivý vzor, ktorý umožňuje krok za krokom vytvárať zložité objekty. Oddeľuje proces konštrukcie zloženého objektu od jeho zobrazenia, takže ten istý proces výstavby môže vytvárať rôzne zobrazenia.
Hlavné komponenty:
- Staviteľ (Builder): Rozhranie alebo abstraktná trieda, ktorá definuje metódy na vytváranie častí zloženého objektu.
- Konkrétny Staviteľ (Concrete Builder): Implementuje rozhranie Staviteľa a poskytuje konkrétnu implementáciu na stavbu častí objektu. Uchováva medzivýsledok a poskytuje metódu na získanie hotového produktu.
- Riaditeľ (Director): Nepovinná zložka. Určuje poradie volaní metód staviteľa na vytvorenie objektu. Nevie o konkrétnych staviteľoch.
- Produkt (Product): Zložitý objekt, ktorý vytvára staviteľ.
Použitie:
- Keď je proces vytvárania objektu zložitý a zahŕňa množstvo voliteľných krokov.
- Keď je potrebné vytvárať rôzne zobrazenia toho istého objektu pomocou rovnakého procesu výstavby.
- Keď má konštruktor objektu veľké množstvo parametrov.
Príklad v Go:
// Produkt - zložitý objekt
type Product struct {
PartA string
PartB string
PartC string
}
// Staviteľ - rozhranie
type Builder interface {
BuildPartA()
BuildPartB()
BuildPartC()
GetProduct() *Product
}
// Konkrétny Staviteľ
type ConcreteBuilder struct {
product *Product
}
func NewConcreteBuilder() *ConcreteBuilder {
return &ConcreteBuilder{product: &Product{}}
}
func (cb *ConcreteBuilder) BuildPartA() {
cb.product.PartA = "Časť A postavená"
}
func (cb *ConcreteBuilder) BuildPartB() {
cb.product.PartB = "Časť B postavená"
}
func (cb *ConcreteBuilder) BuildPartC() {
cb.product.PartC = "Časť C postavená"
}
func (cb *ConcreteBuilder) GetProduct() *Product {
return cb.product
}
// Riaditeľ - voliteľný)
type Director struct {
builder Builder
}
func NewDirector(builder Builder) *Director {
return &Director{builder: builder}
}
func (d *Director) Construct() {
d.builder.BuildPartA()
d.builder.BuildPartB()
d.builder.BuildPartC()
}
// Použitie
// concreteBuilder := NewConcreteBuilder()
// director := NewDirector(concreteBuilder)
// director.Construct()
// product := concreteBuilder.GetProduct()
// fmt.Printf("Vytvorený produkt: %+v\n", product)
Výhody:
- Izoluje kód výstavby objektu od jeho klientského kódu.
- Umožňuje meniť vnútorné zobrazenie produktu bez zmeny klientského kódu.
- Umožňuje krok za krokom stavať objekt.
- Zjednodušuje vytváranie objektov s veľkým počtom parametrov.
Nevýhody:
- Zvyšuje počet kódov (tried/rozhraní) na vytvorenie objektu.
- Môže byť nadbytočný pre jednoduché objekty.