Middle
Mis on disainimuster 'Ehitusmees' (Builder)?
sobes.tech AI
Vastus AI-lt
„Ehitusmudel“ (Builder) muster on loomise muster, mis võimaldab samm-sammult luua keerukaid objekte, pakkudes erinevaid konfiguratsioonivõimalusi.
- Eesmärk: eraldada objekti ehitusprotsess selle esitlusest. võimaldab saada erinevaid esitusi sama ehitusprotsessi kohta.
- Eelised:
- võimaldab samm-sammult ehitada objekti, varjates ehituse üksikasju.
- lihtsustab objektide loomist suure hulga valikuliste parameetritega (erinevalt konstruktoritest, millel on palju argumente või antipattern Telescoping Constructors).
- saab kasutada sama ehituskoodi erinevate objektide esituste loomiseks.
- Peamised osalejad:
- Builder (Ehitaja): liides või abstraktne klass, mis määratleb objekti osade ehitamise sammud.
- ConcreteBuilder (Konkreetne Ehitaja): Builder liidese rakendus, mis loob konkreetsed osad ja pakub meetodi lõpptulemuse saamiseks.
- Director (Direktor): määrab sammude järjekorra objekti loomiseks, kasutades Builder objekti. Direktor ei ole kohustuslik ning klient võib otse ehitajaga töötada.
- Product (Toode): esindatav objekt, mis ehitatakse.
Struktuuri näide (Java):
// Toode
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 + "]";
}
}
// Ehitaja liides
interface CarBuilder {
void buildEngine();
void buildWheels();
void buildColor();
Car getResult();
}
// Konkreetne Ehitaja
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;
}
}
// Direktori (valikuline)
class CarDirector {
private CarBuilder builder;
public CarDirector(CarBuilder builder) {
this.builder = builder;
}
public void constructCar() {
builder.buildEngine();
builder.buildWheels();
builder.buildColor();
}
}
// Klient
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("Ehitatud auto: " + sportsCar);
// Otse kasutamine ilma direktorita
CarBuilder anotherSportsCarBuilder = new SportsCarBuilder();
anotherSportsCarBuilder.buildEngine();
anotherSportsCarBuilder.buildColor(); // ilma ratasteta
Car partialCar = anotherSportsCarBuilder.getResult();
System.out.println("Ehitatud osaline auto: " + partialCar);
}
}