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.