Builder-designmønsteret indkapsler et objekts egenskaber og giver dig mulighed for at konstruere en repræsentation af det. Dette mønster lader dig konstruere komplekse objekter med forskellige egenskaber, selvom de tilhører samme klasse.
En typisk objektklasse indeholder attributter, konstruktører og metoder. Bygherremønstret giver dig mulighed for at udtrække konstruktionslogikken fra objektklassen og placere den i klasser kaldet bygherrer. Du kan derefter bruge disse builder-klasser til at skabe forskellige variationer af det samme objekt.
Implementering af Builder-mønsteret i Java
Et godt eksempel på byggemønsteret er et pizzabestillingssystem, der giver kunderne mulighed for at vælge forskellige toppingsmuligheder.
Produktklassen
En tilgang er at gøre bygherren til en grænseflade, men du skal først oprette en produktklasse. Produktet i denne prøveapplikation er en pizza.
offentligklassePizza{
// ejendomme
privatint Ordrenummer;
privat Snor pizzaDej;
privat Snor topping;
// gettere og sættere
offentligintgetOrdreNumber(){
Vend tilbage Ordrenummer;
}
offentligugyldigsætOrdreNumber(int Ordrenummer){
det her.ordreNumber = ordrenummer;
}
offentlig Snor få PizzaDough(){
Vend tilbage pizzaDej;
}
offentligugyldigsæt PizzaDough(String pizzaDough){
det her.pizzaDough = pizzaDough;
}
offentlig Snor getTopping(){
Vend tilbage topping;
}
offentligugyldigsetTopping(String topping){
det her.topping = topping;
}
}
Bygmesterklassen
Pizzaen Java klasse har tre ejendomme og deres respektive gettere og sættere, men der er ingen konstruktør metoder. Builder-grænsefladen giver dig mulighed for at oprette hvert aspekt af pizzaobjektet separat. Det vil så give dig mulighed for at hente hele pizzaobjektet.
offentliginterfaceBygger{
offentligugyldigskabe PizzaDough();
offentligugyldigskabe Topping();
offentlig Pizza få Pizza();
}
Prøvepizzaapplikationen giver kunderne mulighed for at bestille enhver toppings, såsom ost, pepperoni, løg eller forskellige kombinationer. Derfor er en pizza, som en kunde vil bestille, ost.
offentligklasseCheesePizzaBuilderredskaberBygger{
privat Pizza pizza;
offentligCheesePizzaBuilder(){
det her.pizza = ny Pizza();
}
@Tilsidesæt
offentligugyldigskabe PizzaDough(){
det her.pizza.setPizzaDough("Dej");
}
@Tilsidesæt
offentligugyldigskabe Topping(){
det her.pizza.setTopping("Ost");
}
@Tilsidesæt
offentlig Pizza få Pizza(){
Vend tilbagedet her.pizza;
}
}
CheesePizzaBuilder-klassen implementerer Builder-grænsefladen og bruger den til at skabe en ny ostepizza. Dette er en repræsentation af Pizza-objektet. Det gør den også på en måde, der er uafhængig af Pizza-klassen.
CheesePizzaBuilder-klassen ved ikke meget om Pizza-klassen, den ved kun, hvad den skal vide for at fuldføre sin funktion. Den ved, at Pizza-klassen har en dej- og en topping-egenskab, og den sætter disse egenskaber til to specifikke værdier, som enhver ostepizza vil have. Nu, hver gang applikationen kalder CheesePizzaBuilder-klassen, vil den skabe en ny Pizza, der har ostetopping.
Direktørklassen
Instruktørklassen er et afgørende aspekt af bygherremønstret. Det eneste formål med en betonbyggerklasse er at skabe et specifikt objekt. Det opnås ved at skabe de forskellige dele af et objekt separat.
Bygherrebetonklasserne er dog uvidende om algoritmen. Ingen af bygmesterklasserne ved, hvordan dejen skal bygges, før toppingen tilsættes. Dette er direktørklassens funktion.
offentligklasseDirektør{
privat Builder pizzaBuilder;
offentligDirektør(Builder pizzaBuilder){
det her.pizzaBuilder = pizzaBuilder;
}
offentlig Pizza få Pizza(){
Vend tilbagedet her.pizzaBuilder.getPizza();
}
offentligugyldiglave pizza(){
det her.pizzaBuilder.createPizzaDough();
det her.pizzaBuilder.createTopping();
}
}
Director-klassen bruger builder-grænsefladen til at lave pizzaer. Det er brugeren af algoritmen.
Fordelene ved at bruge Builder-designmønsteret
Den største fordel ved at bruge bygherrens designmønster er dets indkapslingsegenskab. Dette er et afgørende aspekt af software engineering, da det hjælper med udviklingen af sikre applikationer.
En anden fordel ved dette designmønster er dets objektkonstruktionstilgang. Det lader dig oprette flertrinsprocesser, hvor hvert trin er uafhængigt, hvilket gør fejlfinding lettere.