Sobes.tech
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.