Sobes.tech
Middle

Pastāstiet par dizaina paraugu 'Būvētājs'.

sobes.tech AI

Atbilde no AI

Dizaina paraugs "Būvētājs" (Builder) ir izstrādes paraugs, kas ļauj pakāpeniski veidot sarežģītus objektus. Tas atdala sarežģīta objekta būvniecības procesu no tā attēlojuma, tādējādi vienā būvniecības procesā var radīt dažādus attēlojumus.

Galvenās sastāvdaļas:

  • Būvētājs (Builder): saskarne vai abstrakta klase, kas definē metodes sarežģīta objekta daļu veidošanai.
  • Konkrētais būvētājs (Concrete Builder): īsteno būvētāja saskarni un nodrošina konkrētu realizāciju daļu būvniecībai. Tas glabā starpposma rezultātu un nodrošina metodi gatava objekta iegūšanai.
  • Direktors (Director): neobligāts komponent, kas nosaka metožu izsaukšanas secību objekta būvniecībai. Tas nezin par konkrētiem būvētājiem.
  • Produkts (Product): sarežģīts objekts, ko veido būvētājs.

Pielietojums:

  • Kad objekta būvniecības process ir sarežģīts un ietver daudz izvēles soļu.
  • Kad nepieciešams veidot dažādus tā paša objekta attēlojumus, izmantojot vienu un to pašu būvniecības procesu.
  • Kad objekta konstruktoram ir liels parametru skaits.

Piemērs Go valodā:

// Produkts - sarežģīts objekts
type Product struct {
	PartA string
	PartB string
	PartC string
}

// Būvētājs - saskarne
type Builder interface {
	BuildPartA()
	BuildPartB()
	BuildPartC()
	GetProduct() *Product
}

// Konkrētais būvētājs
type ConcreteBuilder struct {
	product *Product
}

func NewConcreteBuilder() *ConcreteBuilder {
	return &ConcreteBuilder{product: &Product{}}
}

func (cb *ConcreteBuilder) BuildPartA() {
	cb.product.PartA = "Daļa A ir uzbūvēta"
}

func (cb *ConcreteBuilder) BuildPartB() {
	cb.product.PartB = "Daļa B ir uzbūvēta"
}

func (cb *ConcreteBuilder) BuildPartC() {
	cb.product.PartC = "Daļa C ir uzbūvēta"
}

func (cb *ConcreteBuilder) GetProduct() *Product {
	return cb.product
}

// Direktors - neobligāts)
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()
}

// Lietošana
// concreteBuilder := NewConcreteBuilder()
// director := NewDirector(concreteBuilder)
// director.Construct()
// product := concreteBuilder.GetProduct()
// fmt.Printf("Radīts produkts: %+v\n", product)

Priekšrocības:

  • Kods, kas būvē objektu, ir atdalīts no klienta koda.
  • Ļauj mainīt produkta iekšējo attēlojumu bez klienta koda izmaiņām.
  • Pakāpeniska būvēšana.
  • Vienkāršo lielu parametru objektu izveidi.

Trūkumi:

  • Palielina klases/interfeisa skaitu objekta būvēšanai.
  • Var būt lieks vienkāršiem objektiem.