Sobes.tech
Middle

Τι είναι το μοτίβο σχεδίασης 'Builder' (Κατασκευαστής);

sobes.tech AI

Απάντηση από AI

Το μοτίβο "Builder" (Κατασκευαστής) είναι ένα δημιουργικό μοτίβο σχεδίασης που επιτρέπει τη σταδιακή δημιουργία πολύπλοκων αντικειμένων, παρέχοντας διάφορες επιλογές διαμόρφωσης.

  • Σκοπός: Ξεχωρίστε τη διαδικασία κατασκευής ενός αντικειμένου από την παρουσίασή του. Επιτρέπει την απόκτηση διαφορετικών παρουσιάσεων της ίδιας διαδικασίας κατασκευής.
  • Πλεονεκτήματα:
    • Επιτρέπει την κατασκευή ενός αντικειμένου βήμα προς βήμα, κρύβοντας τις λεπτομέρειες κατασκευής.
    • Διευκολύνει τη δημιουργία αντικειμένων με πολλαπλές προαιρετικές παραμέτρους (σε αντίθεση με τους κατασκευαστές με πολλαπλές παραμέτρους ή το αντι-μοτίβο Telescoping Constructors).
    • Μπορεί να χρησιμοποιήσει τον ίδιο κώδικα κατασκευής για τη δημιουργία διαφορετικών παρουσιάσεων του αντικειμένου.
  • Βασικοί συμμετέχοντες:
    1. Builder (Κατασκευαστής): Διεπαφή ή αφηρημένη κλάση που ορίζει τα βήματα κατασκευής των μερών του αντικειμένου.
    2. ConcreteBuilder (Συγκεκριμένος Κατασκευαστής): Υλοποίηση της διεπαφής Builder, που δημιουργεί συγκεκριμένα μέρη του αντικειμένου και παρέχει μέθοδο για την απόκτηση του τελικού αποτελέσματος.
    3. Director (Διευθυντής): Ορίζει τη σειρά των βημάτων για τη δημιουργία του αντικειμένου, χρησιμοποιώντας το αντικείμενο Builder. Ο Διευθυντής είναι προαιρετικός και ο πελάτης μπορεί να εργάζεται απευθείας με τον Κατασκευαστή.
    4. Product (Προϊόν): Το αντικείμενο που κατασκευάζεται.

Παράδειγμα δομής (Java):

// Προϊόν
class Car {
    private String engine;
    private int wheels;
    private String color;

    public void setEngine(String engine) {
        this.engine = engine;
    }

    public void setWheels(int wheels) {
        this.wheels = wheels;
    }

    public void setColor(String color) {
        this.color = color;
    }

    @Override
    public String toString() {
        return "Car [engine=" + engine + ", wheels=" + wheels + ", color=" + color + "]";
    }
}

// Διεπαφή Builder
interface CarBuilder {
    void buildEngine();
    void buildWheels();
    void buildColor();
    Car getResult();
}

// Συγκεκριμένος Κατασκευαστής
class SportsCarBuilder implements CarBuilder {
    private Car car = new Car();

    @Override
    public void buildEngine() {
        car.setEngine("V8");
    }

    @Override
    public void buildWheels() {
        car.setWheels(4);
    }

    @Override
    public void buildColor() {
        car.setColor("Red");
    }

    @Override
    public Car getResult() {
        return car;
    }
}

// Διευθυντής (Προαιρετικό)
class CarDirector {
    private CarBuilder builder;

    public CarDirector(CarBuilder builder) {
        this.builder = builder;
    }

    public void constructCar() {
        builder.buildEngine();
        builder.buildWheels();
        builder.buildColor();
    }
}

// Χρήστης
public class Client {
    public static void main(String[] args) {
        CarBuilder sportsCarBuilder = new SportsCarBuilder();
        CarDirector director = new CarDirector(sportsCarBuilder);

        director.constructCar();
        Car sportsCar = sportsCarBuilder.getResult();
        System.out.println("Κατασκευασμένο αυτοκίνητο: " + sportsCar);

        // Άμεση χρήση χωρίς Διευθυντή
        CarBuilder anotherSportsCarBuilder = new SportsCarBuilder();
        anotherSportsCarBuilder.buildEngine();
        anotherSportsCarBuilder.buildColor(); // Κατασκευή χωρίς τροχούς
        Car partialCar = anotherSportsCarBuilder.getResult();
        System.out.println("Κατασκευασμένο μερικό αυτοκίνητο: " + partialCar);
    }
}