Middle
Τι είναι ο builder (κατασκευαστής) στο πλαίσιο της ανάπτυξης λογισμικού;
sobes.tech AI
Απάντηση από AI
Το μοτίβο σχεδίασης που διαχωρίζει τη διαμόρφωση ενός πολύπλοκου αντικειμένου από την παρουσίασή του, επιτρέποντας τη δημιουργία διαφορετικών παρουσιάσεων της ίδιας διαδικασίας κατασκευής.
Βασικά χαρακτηριστικά:
- Διαχωρισμός ευθυνών: Η λογική δημιουργίας του αντικειμένου (βήματα κατασκευής) και η παρουσίαση του αντικειμένου (το τελικό προϊόν) είναι διαχωρισμένα.
- Βήμα προς βήμα κατασκευή: Το αντικείμενο κατασκευάζεται βήμα προς βήμα, καθιστώντας τη διαδικασία πιο ευέλικτη και κατανοητή.
- Διαφορετικές παρουσιάσεις: Η ίδια διαδικασία κατασκευής μπορεί να χρησιμοποιηθεί για τη δημιουργία διαφορετικών παραλλαγών του αντικειμένου.
- Εγκλεισμός: Οι λεπτομέρειες δημιουργίας του αντικειμένου είναι κρυφές από τον πελάτη, απλοποιώντας τη χρήση του.
Κύριοι συμμετέχοντες:
- Builder (Κατασκευαστής): Αφηρημένο interface ή κλάση που ορίζει τα βήματα για τη δημιουργία μερών του προϊόντος.
- ConcreteBuilder (Συγκεκριμένος Κατασκευαστής): Πραγματική υλοποίηση του Builder που εκτελεί την κατασκευή των μερών του προϊόντος και αποθηκεύει το αποτέλεσμα.
- Director (Διευθυντής): Κλάση που χρησιμοποιεί το αντικείμενο ConcreteBuilder για να κατασκευάσει το προϊόν, καλώντας τις αντίστοιχες μεθόδους σε συγκεκριμένη σειρά.
- Product (Προϊόν): Το πολύπλοκο αντικείμενο που κατασκευάζεται.
Παράδειγμα χρήσης:
Δημιουργία ενός αντικειμένου Pizza με διαφορετικά συστατικά:
// Προϊόν
class Pizza {
private String dough;
private String sauce;
private String cheese;
private List<String> toppings;
public void setDough(String dough) { this.dough = dough; }
public void setSauce(String sauce) { this.sauce = sauce; }
public void setCheese(String cheese) { this.cheese = cheese; }
public void addTopping(String topping) {
if (toppings == null) {
toppings = new ArrayList<>();
}
toppings.add(topping);
}
@Override
public String toString() {
return "Pizza με ζύμη: " + dough + ", σάλτσα: " + sauce + ", τυρί: " + cheese + ", toppings: " + toppings;
}
}
// Builder interface
interface PizzaBuilder {
void buildDough();
void buildSauce();
void buildCheese();
void addTopping(String topping);
Pizza getResult();
}
// ConcreteBuilder
class MargheritaPizzaBuilder implements PizzaBuilder {
private Pizza pizza;
public MargheritaPizzaBuilder() {
this.pizza = new Pizza();
}
@Override
public void buildDough() {
pizza.setDough("Λεπτή βάση");
}
@Override
public void buildSauce() {
pizza.setSauce("Ντομάτα σάλτσα");
}
@Override
public void buildCheese() {
pizza.setCheese("Μοζαρέλα");
}
@Override
public void addTopping(String topping) {
// Η Margherita δεν έχει επιπλέον toppings από προεπιλογή
}
@Override
public Pizza getResult() {
return pizza;
}
}
// Διευθυντής
class Cook {
private PizzaBuilder pizzaBuilder;
public void setPizzaBuilder(PizzaBuilder pb) {
pizzaBuilder = pb;
}
public void constructPizza() {
pizzaBuilder.buildDough();
pizzaBuilder.buildSauce();
pizzaBuilder.buildCheese();
// Επιπλέον toppings μπορούν να προστεθούν εδώ ανάλογα με τον τύπο ή τις απαιτήσεις της πίτσας
}
}
// Κώδικας πελάτη
public class PizzaShop {
public static void main(String[] args) {
Cook cook = new Cook();
PizzaBuilder margheritaBuilder = new MargheritaPizzaBuilder();
cook.setPizzaBuilder(margheritaBuilder);
cook.constructPizza();
Pizza pizza = margheritaBuilder.getResult();
System.out.println(pizza);
}
}
Εφαρμόζεται όταν:
- Χρειάζεται να δημιουργηθεί ένα πολύπλοκο αντικείμενο με πολλαπλές προαιρετικές παραμέτρους.
- Η διαδικασία δημιουργίας είναι διαδοχική και περιλαμβάνει πολλά βήματα.
- Θέλουμε να δημιουργήσουμε διαφορετικές παραλλαγές του ίδιου αντικειμένου χρησιμοποιώντας τον ίδιο αλγόριθμο κατασκευής.
- Πρέπει να αποφευχθεί ο κατασκευαστής με πολλά παραμέτρους ("telescoping constructor").
Πλεονεκτήματα:
- Βελτιώνει την αναγνωσιμότητα και τη συντηρησιμότητα του κώδικα.
- Παρέχει ευελιξία στη δημιουργία αντικειμένων.
- Επιτρέπει τη δημιουργία αμετάβλητων αντικειμένων.
- Αποφεύγει την ανάγκη για πολλούς κατασκευαστές.
Μειονεκτήματα:
- Μπορεί να αυξήσει τον αριθμό των κλάσεων στο έργο (για κάθε τύπο αντικειμένου και κάθε κατασκευαστή).
- Απαιτεί αρχικό σχεδιαστικό κόπο.