Sobes.tech
Middle

Τι είναι ο Builder στο πλαίσιο του σχεδιασμού λογισμικού;

sobes.tech AI

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

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

Αρχή λειτουργίας:

  • Προϊόν (Product): Ένα πολύπλοκο αντικείμενο που πρέπει να κατασκευαστεί.
  • Κατασκευαστής (Builder): Ένα αφηρημένο interface για τη δημιουργία μερών του προϊόντος.
  • Συγκεκριμένος Κατασκευαστής (Concrete Builder): Υλοποίηση του interface "Builder", που δημιουργεί συγκεκριμένα μέρη του προϊόντος και τα συναρμολογεί σε ένα έτοιμο προϊόν.
  • Διευθυντής (Director, προαιρετικά): Καθορίζει τη σειρά των βημάτων κατασκευής και χρησιμοποιεί τον Κατασκευαστή για τη δημιουργία του προϊόντος.

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

  • Επιτρέπει τη δημιουργία πολύπλοκων αντικειμένων βήμα προς βήμα.
  • Διαχωρίζει τη λογική κατασκευής του αντικειμένου από το ίδιο το αντικείμενο.
  • Επιτρέπει τη δημιουργία διαφορετικών παρουσιάσεων του αντικειμένου με την ίδια διαδικασία.
  • Διευκολύνει την επέκταση με την προσθήκη νέων Concrete Builders.

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

  • Αυξάνει τον αριθμό των κλάσεων λόγω της ανάγκης δημιουργίας ξεχωριστών Concrete Builders.
  • Μπορεί να περιπλέξει τον κώδικα για απλά αντικείμενα.

Παράδειγμα χρήσης (Java):

Ας δημιουργήσουμε ένα πολύπλοκο αντικείμενο "Σπίτι":

// Προϊόν
class House {
    private String walls;
    private String roof;
    private String windows;
    private String doors;

    public void setWalls(String walls) { this.walls = walls; }
    public void setRoof(String roof) { this.roof = roof; }
    public void setWindows(String windows) { this.windows = windows; }
    public void setDoors(String doors) { this.doors = doors; }

    @Override
    public String toString() {
        return "House{" +
               "walls='" + walls + '\'' +
               ", roof='" + roof + '\'' +
               ", windows='" + windows + '\'' +
               ", doors='" + doors + '\'' +
               '}';
    }
}

// Κατασκευαστής
interface HouseBuilder {
    void buildWalls();
    void buildRoof();
    void buildWindows();
    void buildDoors();
    House getResult();
}

// Συγκεκριμένος Κατασκευαστής
class StoneHouseBuilder implements HouseBuilder {
    private House house;

    public StoneHouseBuilder() {
        this.house = new House();
    }

    @Override
    public void buildWalls() {
        house.setWalls("Stone Walls");
    }

    @Override
    public void buildRoof() {
        house.setRoof("Tile Roof");
    }

    @Override
    public void buildWindows() {
        house.setWindows("Wooden Windows");
    }

    @Override
    public void buildDoors() {
        house.setDoors("Solid Wooden Doors");
    }

    @Override
    public House getResult() {
        return house;
    }
}

// Διευθυντής (προαιρετικά)
class Director {
    public void constructStoneHouse(HouseBuilder builder) {
        builder.buildWalls();
        builder.buildRoof();
        builder.buildWindows();
        builder.buildDoors();
    }
}

// Χρήση
public class BuilderExample {
    public static void main(String[] args) {
        Director director = new Director();
        HouseBuilder stoneHouseBuilder = new StoneHouseBuilder();

        director.constructStoneHouse(stoneHouseBuilder);

        House stoneHouse = stoneHouseBuilder.getResult();
        System.out.println(stoneHouse); // Έξοδος: House{walls='Stone Walls', roof='Tile Roof', windows='Wooden Windows', doors='Solid Wooden Doors'}
    }
}