Middle
Papaskokite apie dizaino šabloną 'Statybininkas'.
sobes.tech AI
Atsakymas iš AI
Dizaino šablonas "Kūrėjas" (Builder) yra kūrimo šablonas, leidžiantis žingsnis po žingsnio kurti sudėtingus objektus. Jis atskiria sudėtingo objekto konstravimo procesą nuo jo vaizdavimo, kad tas pats konstravimo procesas galėtų kurti skirtingus vaizdus.
Pagrindinės sudedamosios dalys:
- Kūrėjas (Builder): sąsaja arba abstrakti klasė, apibrėžianti metodus sudėtingo objekto dalių kūrimui.
- Konkretaus Kūrėjo (Concrete Builder) įgyvendinimas: realizuoja Kūrėjo sąsają ir teikia konkretų įgyvendinimą dalių kūrimui. Laikosi tarpinio rezultato ir teikia metodą gauti paruoštą produktą.
- Direktorius (Director): neprivalomas komponentas. Nustato metodo iškvietimo tvarką objekto kūrimui. Nežino apie konkrečius kūrėjus.
- Produktas (Product): sudėtingas objektas, kurį kuria kūrėjas.
Naudojimas:
- Kai objekto kūrimo procesas yra sudėtingas ir apima daugybę pasirenkamų žingsnių.
- Kai reikia kurti skirtingus to paties objekto vaizdus naudojant tą patį konstravimo procesą.
- Kai objekto konstruktorius turi daug parametrų.
Pavyzdys Go kalba:
// Produktas - sudėtingas objektas
type Product struct {
PartA string
PartB string
PartC string
}
// Kūrėjas - sąsaja
type Builder interface {
BuildPartA()
BuildPartB()
BuildPartC()
GetProduct() *Product
}
// Konkretaus Kūrėjo struktūra
type ConcreteBuilder struct {
product *Product
}
func NewConcreteBuilder() *ConcreteBuilder {
return &ConcreteBuilder{product: &Product{}}
}
func (cb *ConcreteBuilder) BuildPartA() {
cb.product.PartA = "Dalis A sukurta"
}
func (cb *ConcreteBuilder) BuildPartB() {
cb.product.PartB = "Dalis B sukurta"
}
func (cb *ConcreteBuilder) BuildPartC() {
cb.product.PartC = "Dalis C sukurta"
}
func (cb *ConcreteBuilder) GetProduct() *Product {
return cb.product
}
// Direktorius - neprivalomas)
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()
}
// Naudojimas
// concreteBuilder := NewConcreteBuilder()
// director := NewDirector(concreteBuilder)
// director.Construct()
// product := concreteBuilder.GetProduct()
// fmt.Printf("Sukurta produkcija: %+v\n", product)
Privalumai:
- Kodas, kuris kuria objektą, yra atskirtas nuo kliento kodo.
- Leidžia keisti produkto vidinį vaizdą be kliento kodo keitimo.
- Žingsnis po žingsnio kurti objektą.
- Supaprastina didelės parametrų kiekio objektų kūrimą.
Trūkumai:
- Padidina klasių/įvairių sąsajų skaičių objekto kūrimui.
- Gali būti perteklinis paprastiems objektams.