Sobes.tech
Middle

Vorbește despre șablonul de proiectare 'Constructor'.

sobes.tech AI

Răspuns de la AI

Modelul de proiectare "Builder" (Constructor) este un model creational care permite crearea pas cu pas a obiectelor complexe. El separă procesul de construcție al unui obiect complex de reprezentarea sa, astfel încât același proces de construcție poate crea diferite reprezentări.

Componente principale:

  • Builder (Constructor): Interfață sau clasă abstractă care definește metodele pentru crearea părților unui obiect complex.
  • Builder Concret (Concrete Builder): Implementează interfața Builder și oferă o implementare concretă pentru construirea părților obiectului. Stochează rezultatul intermediar și oferă o metodă pentru obținerea obiectului final.
  • Director (Director): Componentă opțională. Definește ordinea în care sunt apelate metodele builder pentru crearea obiectului. Nu cunoaște constructorii concreți.
  • Produs (Product): Obiect complex creat de builder.

Aplicații:

  • Când procesul de creare a obiectului este complex și include multiple pași opționali.
  • Când este necesar să se creeze diferite reprezentări ale aceluiași obiect, folosind același proces de construcție.
  • Când constructorul obiectului are mulți parametri.

Exemplu în Go:

// Produs - obiect complex
type Product struct {
	PartA string
	PartB string
	PartC string
}

// Builder - interfața builder-ului
type Builder interface {
	BuildPartA()
	BuildPartB()
	BuildPartC()
	GetProduct() *Product
}

// BuilderConcret - builder concret
type ConcreteBuilder struct {
	product *Product
}

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

func (cb *ConcreteBuilder) BuildPartA() {
	cb.product.PartA = "Parte A construită"
}

func (cb *ConcreteBuilder) BuildPartB() {
	cb.product.PartB = "Parte B construită"
}

func (cb *ConcreteBuilder) BuildPartC() {
	cb.product.PartC = "Parte C construită"
}

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

// Director - director (opțional)
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()
}

// Utilizare
// concreteBuilder := NewConcreteBuilder()
// director := NewDirector(concreteBuilder)
// director.Construct()
// product := concreteBuilder.GetProduct()
// fmt.Printf("Produsul creat: %+v\n", product)

Avantaje:

  • Izolează codul de construcție a obiectului de codul client.
  • Permite schimbarea reprezentării interne a produsului fără a modifica codul client.
  • Permite construirea pas cu pas a obiectului.
  • Simplifică crearea obiectelor cu mulți parametri.

Dezavantaje:

  • Crește cantitatea de cod (clase/interfețe) necesară pentru crearea obiectului.
  • Poate fi redundant pentru obiecte simple.