Sobes.tech
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").

Πλεονεκτήματα:

  • Βελτιώνει την αναγνωσιμότητα και τη συντηρησιμότητα του κώδικα.
  • Παρέχει ευελιξία στη δημιουργία αντικειμένων.
  • Επιτρέπει τη δημιουργία αμετάβλητων αντικειμένων.
  • Αποφεύγει την ανάγκη για πολλούς κατασκευαστές.

Μειονεκτήματα:

  • Μπορεί να αυξήσει τον αριθμό των κλάσεων στο έργο (για κάθε τύπο αντικειμένου και κάθε κατασκευαστή).
  • Απαιτεί αρχικό σχεδιαστικό κόπο.