Middle
Μιλήστε για το μοτίβο σχεδίασης 'Κατασκευαστής'.
sobes.tech AI
Απάντηση από AI
Το πρότυπο σχεδίασης "Builder" (Κατασκευαστής) είναι ένα δημιουργικό πρότυπο που επιτρέπει τη δημιουργία πολύπλοκων αντικειμένων βήμα προς βήμα. Διαχωρίζει τη διαδικασία κατασκευής ενός πολύπλοκου αντικειμένου από την αναπαράστασή του, έτσι ώστε η ίδια διαδικασία κατασκευής να μπορεί να δημιουργεί διαφορετικές αναπαραστάσεις.
Βασικά συστατικά:
- Κατασκευαστής (Builder): Διεπαφή ή αφηρημένη κλάση που ορίζει τις μεθόδους για τη δημιουργία μερών ενός πολύπλοκου αντικειμένου.
- Συγκεκριμένος Κατασκευαστής (Concrete Builder): Υλοποιεί τη διεπαφή του κατασκευαστή και παρέχει μια συγκεκριμένη υλοποίηση για την κατασκευή των μερών του αντικειμένου. Αποθηκεύει το ενδιάμεσο αποτέλεσμα και παρέχει μια μέθοδο για την απόκτηση του τελικού αντικειμένου.
- Διευθυντής (Director): Προαιρετικό συστατικό. Ορίζει τη σειρά με την οποία καλούνται οι μέθοδοι του κατασκευαστή για τη δημιουργία του αντικειμένου. Δεν γνωρίζει τους συγκεκριμένους κατασκευαστές.
- Προϊόν (Product): Το πολύπλοκο αντικείμενο που δημιουργείται από τον κατασκευαστή.
Εφαρμογές:
- Όταν η διαδικασία δημιουργίας του αντικειμένου είναι πολύπλοκη και περιλαμβάνει πολλαπλά προαιρετικά βήματα.
- Όταν χρειάζεται να δημιουργηθούν διαφορετικές αναπαραστάσεις του ίδιου αντικειμένου χρησιμοποιώντας την ίδια διαδικασία κατασκευής.
- Όταν ο κατασκευαστής του αντικειμένου έχει μεγάλο αριθμό παραμέτρων.
Παράδειγμα σε Go:
// Προϊόν - πολύπλοκο αντικείμενο
type Product struct {
PartA string
PartB string
PartC string
}
// Builder - διεπαφή του κατασκευαστή
type Builder interface {
BuildPartA()
BuildPartB()
BuildPartC()
GetProduct() *Product
}
// Συγκεκριμένος Κατασκευαστής - υλοποίηση
type ConcreteBuilder struct {
product *Product
}
func NewConcreteBuilder() *ConcreteBuilder {
return &ConcreteBuilder{product: &Product{}}
}
func (cb *ConcreteBuilder) BuildPartA() {
cb.product.PartA = "Μέρος A κατασκευάστηκε"
}
func (cb *ConcreteBuilder) BuildPartB() {
cb.product.PartB = "Μέρος B κατασκευάστηκε"
}
func (cb *ConcreteBuilder) BuildPartC() {
cb.product.PartC = "Μέρος C κατασκευάστηκε"
}
func (cb *ConcreteBuilder) GetProduct() *Product {
return cb.product
}
// Διευθυντής - προαιρετικό
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()
}
// Χρήση
// concreteBuilder := NewConcreteBuilder()
// director := NewDirector(concreteBuilder)
// director.Construct()
// product := concreteBuilder.GetProduct()
// fmt.Printf("Δημιουργημένο προϊόν: %+v\n", product)
Πλεονεκτήματα:
- Απομονώνει τον κώδικα κατασκευής του αντικειμένου από τον κώδικα πελάτη.
- Επιτρέπει την αλλαγή της εσωτερικής αναπαράστασης του προϊόντος χωρίς να αλλάξει ο κώδικας πελάτη.
- Επιτρέπει την κατασκευή του αντικειμένου βήμα προς βήμα.
- Απλοποιεί τη δημιουργία αντικειμένων με πολλούς παραμέτρους.
Μειονεκτήματα:
- Αυξάνει τον αριθμό του κώδικα (κλάσεις/διασυνδέσεις) που απαιτείται για την κατασκευή του αντικειμένου.
- Μπορεί να είναι περιττό για απλά αντικείμενα.