Sobes.tech
Middle

Meséljen a 'Konstruktor' tervezési mintáról.

sobes.tech MI

Válasz az MI-től

A "Készítő" (Builder) tervezési minta egy létrehozó minta, amely lehetővé teszi összetett objektumok lépésenkénti létrehozását. Elkülöníti az összetett objektum építési folyamatát a megjelenítésétől, így ugyanaz az építési folyamat különböző megjelenítéseket hozhat létre.

Fő komponensek:

  • Készítő (Builder): Egy interfész vagy absztrakt osztály, amely meghatározza az összetett objektum részeinek létrehozásához szükséges módszereket.
  • Konkrét Készítő (Concrete Builder): Megvalósítja a Készítő interfészt, és konkrét megvalósítást nyújt az objektum részeinek építéséhez. Tárolja a közbenső eredményt, és lehetővé teszi a kész termék lekérését.
  • Igazgató (Director): Nem kötelező komponens. Meghatározza a készítő módszereinek hívási sorrendjét az objektum létrehozásához. Nem ismeri a konkrét készítőket.
  • Termék (Product): Egy összetett objektum, amelyet a készítő hoz létre.

Alkalmazás:

  • Amikor az objektum létrehozási folyamata összetett, és számos opcionális lépést tartalmaz.
  • Amikor különböző megjelenítéseket kell létrehozni ugyanarról az objektumról, ugyanazzal az építési folyamattal.
  • Amikor az objektum konstruktorának sok paramétere van.

Go példával:

// Termék - összetett objektum
type Product struct {
	PartA string
	PartB string
	PartC string
}

// Készítő - interfész
type Builder interface {
	BuildPartA()
	BuildPartB()
	BuildPartC()
	GetProduct() *Product
}

// Konkrét Készítő
type ConcreteBuilder struct {
	product *Product
}

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

func (cb *ConcreteBuilder) BuildPartA() {
	cb.product.PartA = "A rész elkészült"
}

func (cb *ConcreteBuilder) BuildPartB() {
	cb.product.PartB = "B rész elkészült"
}

func (cb *ConcreteBuilder) BuildPartC() {
	cb.product.PartC = "C rész elkészült"
}

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

// Igazgató - opcionális)
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()
}

// Használat
// concreteBuilder := NewConcreteBuilder()
// director := NewDirector(concreteBuilder)
// director.Construct()
// product := concreteBuilder.GetProduct()
// fmt.Printf("Létrehozott termék: %+v\n", product)

Előnyök:

  • Elkülöníti az objektum építési kódját a klienskódjától.
  • Lehetővé teszi a termék belső megjelenítésének módosítását anélkül, hogy a klienskódot módosítani kellene.
  • Lépésenkénti építést tesz lehetővé.
  • Egyszerűsíti a sok paraméterrel rendelkező objektumok létrehozását.

Hátrányok:

  • Növeli az osztályok/interfészek számát az objektum létrehozásához.
  • Túlságosan bonyolult lehet egyszerű objektumok esetén.