Middle
Rääkige disainimustrist 'Ehitaja'.
sobes.tech AI
Vastus AI-lt
Disaini muster "Ehitusmees" (Builder) on loomise muster, mis võimaldab samm-sammult luua keerukaid objekte. See eraldab keeruka objekti ehitusprotsessi selle esitlusest, nii et sama ehitusprotsess võib luua erinevaid esitusi.
Peamised komponendid:
- Ehitaja (Builder): liides või abstraktne klass, mis määratleb meetodid keeruka objekti osade loomiseks.
- Konkreetne Ehitaja (Concrete Builder): rakendab Ehitaja liidest ja pakub konkreetset teostust osade ehitamiseks. Hoidub vahepealset tulemust ja pakub meetodit valmis objekti saamiseks.
- Direktor (Director): mittekohustuslik komponent. Määrab ehitaja meetodite kutsumise järjekorra objekti loomiseks. Ei tea konkreetsetest ehitajatest.
- Toode (Product): keeruline objekt, mille ehitab ehitaja.
Rakendamine:
- Kui objekti loomise protsess on keeruline ja hõlmab mitmeid valikulisi samme.
- Kui on vaja luua sama protsessi kasutades erinevaid esitusi ühe ja sama objekti kohta.
- Kui objekti konstruktoril on palju parameetreid.
Näide Go keeles:
// Toode - keeruline objekt
type Product struct {
PartA string
PartB string
PartC string
}
// Ehitaja - liides
type Builder interface {
BuildPartA()
BuildPartB()
BuildPartC()
GetProduct() *Product
}
// Konkreetne Ehitaja
type ConcreteBuilder struct {
product *Product
}
func NewConcreteBuilder() *ConcreteBuilder {
return &ConcreteBuilder{product: &Product{}}
}
func (cb *ConcreteBuilder) BuildPartA() {
cb.product.PartA = "Osa A on ehitatud"
}
func (cb *ConcreteBuilder) BuildPartB() {
cb.product.PartB = "Osa B on ehitatud"
}
func (cb *ConcreteBuilder) BuildPartC() {
cb.product.PartC = "Osa C on ehitatud"
}
func (cb *ConcreteBuilder) GetProduct() *Product {
return cb.product
}
// Direktor - mittekohustuslik)
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()
}
// Kasutamine
// concreteBuilder := NewConcreteBuilder()
// director := NewDirector(concreteBuilder)
// director.Construct()
// product := concreteBuilder.GetProduct()
// fmt.Printf("Loodud toode: %+v\n", product)
Eelised:
- Kood ehituse objekti eraldab selle kliendikoodist.
- Võimaldab muuta toote sisemist esitlust ilma kliendikoodi muutmata.
- Samm-sammult ehitamine.
- Lihtsustab suure arvu parameetritega objektide loomist.
Puudused:
- Suurendab klasside/liideste arvu objekti loomiseks.
- Võib olla liigkasutatud lihtsate objektide puhul.