Sobes.tech
Middle

Papaskink apie dizaino šabloną Builder (Statybininkas).

sobes.tech AI

Atsakymas iš AI

Builder — tai kūrybinis šablonas, leidžiantis žingsnis po žingsnio kurti sudėtingus objektus.

Naudojama, kai:

  • Objekto kūrimo procesas yra sudėtingas ir apima daug žingsnių.
  • Reikia kurti skirtingus to paties objekto vaizdus.
  • Objekto konstruktorius turi daug neprivalomų parametrų.

Šablonas susideda iš šių vaidmenų:

  • Builder: Sąsaja, apibrėžianti objekto statymo žingsnius.
  • ConcreteBuilder: Konkretus Builder įgyvendinimas, atliekantis statymo žingsnius ir teikiantis metodą gauti paruoštą objektą.
  • Product: Sudėtingas objektas, kuris yra kuriamas.
  • Director (neprivaloma): Nustato statymo žingsnių iškvietimo tvarką.

Pavyzdys Golang be Director:

// Product - objektas, kurį kuriame
type Pizza struct {
	Dough   string
	Sauce   string
	Toppings []string
}

// Builder - konstruktoriaus sąsaja
type PizzaBuilder interface {
	SetDough(dough string) PizzaBuilder
	SetSauce(sauce string) PizzaBuilder
	AddTopping(topping string) PizzaBuilder
	Build() Pizza // Paruošto objekto gavimo metodas
}

// ConcreteBuilder - konkretus konstruktoriaus įgyvendinimas
type HawaiianPizzaBuilder struct {
	pizza Pizza
}

func NewHawaiianPizzaBuilder() *HawaiianPizzaBuilder {
	return &HawaiianPizzaBuilder{}
}

func (b *HawaiianPizzaBuilder) SetDough(dough string) PizzaBuilder {
	b.pizza.Dough = dough
	return b
}

func (b *HawaiianPizzaBuilder) SetSauce(sauce string) PizzaBuilder {
	b.pizza.Sauce = sauce
	return b
}

func (b *HawaiianPizzaBuilder) AddTopping(topping string) PizzaBuilder {
	b.pizza.Toppings = append(b.pizza.Toppings, topping)
	return b
}

func (b *HawaiianPizzaBuilder) Build() Pizza {
	return b.pizza
}

// Pavyzdys naudojimo
func main() {
	// Sukuriame statytoją Havajų picei
	builder := NewHawaiianPizzaBuilder()

	// Žingsnis po žingsnio statome pica
	pizza := builder.
		SetDough("plona").
		SetSauce("pomidorų").
		AddTopping("ananasas").
		AddTopping("šoninė").
		Build() // Gauti paruoštą picą

	fmt.Printf("Sukurta pica: %+v\n", pizza)
}

Šablono privalumai:

  • Leidžia izoliuoti sudėtingo objekto kūrimo procesą nuo jo vaizdavimo.
  • Užtikrina žingsnis po žingsnio objekto kūrimą.
  • Palengvina skirtingų to paties objekto vaizdų kūrimą.
  • Padaro objekto kūrimo kodą aiškesnį ir prižiūrimą didelių parametrų kiekiu.

Trūkumai:

  • Padidina klasių skaičių projekte.
  • Gali būti perteklinis paprastiems objektams.