Middle
Τι είναι το μοτίβο σχεδίασης 'Builder' (Κατασκευαστής);
sobes.tech AI
Απάντηση από AI
Το μοτίβο "Builder" (Κατασκευαστής) είναι ένα δημιουργικό μοτίβο σχεδίασης που επιτρέπει τη σταδιακή δημιουργία πολύπλοκων αντικειμένων, παρέχοντας διάφορες επιλογές διαμόρφωσης.
- Σκοπός: Ξεχωρίστε τη διαδικασία κατασκευής ενός αντικειμένου από την παρουσίασή του. Επιτρέπει την απόκτηση διαφορετικών παρουσιάσεων της ίδιας διαδικασίας κατασκευής.
- Πλεονεκτήματα:
- Επιτρέπει την κατασκευή ενός αντικειμένου βήμα προς βήμα, κρύβοντας τις λεπτομέρειες κατασκευής.
- Διευκολύνει τη δημιουργία αντικειμένων με πολλαπλές προαιρετικές παραμέτρους (σε αντίθεση με τους κατασκευαστές με πολλαπλές παραμέτρους ή το αντι-μοτίβο Telescoping Constructors).
- Μπορεί να χρησιμοποιήσει τον ίδιο κώδικα κατασκευής για τη δημιουργία διαφορετικών παρουσιάσεων του αντικειμένου.
- Βασικοί συμμετέχοντες:
- Builder (Κατασκευαστής): Διεπαφή ή αφηρημένη κλάση που ορίζει τα βήματα κατασκευής των μερών του αντικειμένου.
- ConcreteBuilder (Συγκεκριμένος Κατασκευαστής): Υλοποίηση της διεπαφής Builder, που δημιουργεί συγκεκριμένα μέρη του αντικειμένου και παρέχει μέθοδο για την απόκτηση του τελικού αποτελέσματος.
- Director (Διευθυντής): Ορίζει τη σειρά των βημάτων για τη δημιουργία του αντικειμένου, χρησιμοποιώντας το αντικείμενο Builder. Ο Διευθυντής είναι προαιρετικός και ο πελάτης μπορεί να εργάζεται απευθείας με τον Κατασκευαστή.
- 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);
}
}