Budowniczy (Builder) to wzorzec projektowy należący do wzorców kreacyjnych. Został on stworzony w celu usprawnienia tworzenia skomplikowanych obiektów. Na końcu procesu tworzenia obiektu klient budowniczego otrzymuje gotowy produkt podobnie jak w przypadku fabryki abstrakcyjnej, jednak cały proces budowania w przypadku wzorca budowniczego składa się z kilku etapów. Plusem zastosowania tego wzorca jest możliwość budowy obiektów o dużym zróżnicowaniu w budowie wewnętrznej oraz to że cały proces budowy jest kontrolowany przez klienta klasy budowniczego.
Przykład zastosowania wzorca Builder:
Produktem wzorca builder jest klasa Building, w której skład wchodzą elemtnty: Roof, Tier oraz Basement.
public interface Roof {
public String getDesign();
}
public class SlateRoof implements Roof {
public String getDesign() {
return " / \\" + '\n' +
" / \\" + '\n' +
" / \\" + '\n' +
" / \\" + '\n' +
"/ \\";
}
}
public class FlatRoof implements Roof {
public String getDesign() {
return "/---------\\";
}
}
public class Basement {
public String getDesign() {
return "_xxxxxxxxx_";
}
}
public class Tier {
public String getDesign() {
return " | o o o |";
}
}
public class Building {
private Roof roof;
private List tiers;
private Basement basement;
public Basement getBasement() {
return basement;
}
public void setBasement(Basement basement) {
this.basement = basement;
}
public Roof getRoof() {
return roof;
}
public void setRoof(Roof roof) {
this.roof = roof;
}
public List getTiers() {
return tiers;
}
public void setTiers(List tiers) {
this.tiers = tiers;
}
public String getDesign() {
String design = roof.getDesign()+'\n';
for (Tier tier : tiers) {
design += tier.getDesign()+'\n';
}
design += basement.getDesign()+'\n';
return design;
}
}
Klasa AbstractBuildingBuilder jest przykładem wzorca Budowniczego (Builder). Definiuje ona metody, które są niezbędne w procesie produkcji klasy Building. Klasa zawiera referencję do obiektu klasy Building oraz metody pozwalające na utworzenie nowego obiektu klasy Building oraz pobranie jego referencji.
public abstract class AbstractBuildingBuilder {
Building building;
public void createBuilding() {
building = new Building();
}
public Building getBuilding() {
return building;
}
public abstract void buildTiers();
public abstract void buildRoof();
public abstract void buildBasement();
}
Implementacja klasy AbstractBuildingBuilder.
public class BobBuilder extends AbstractBuildingBuilder {
private static int TIERS = 5;
@Override
public void buildTiers() {
List tiers = new ArrayList();
for (int i = 0; i < TIERS; i++) {
tiers.add(new Tier());
}
getBuilding().setTiers(tiers);
}
@Override
public void buildRoof() {
getBuilding().setRoof(new FlatRoof());
}
@Override
public void buildBasement() {
getBuilding().setBasement(new Basement());
}
}
Kolejna implementacja klasy AbstractBuildingBuilder.
public class SlateBuilder extends AbstractBuildingBuilder {
@Override
public void buildTiers() {
List tiers = new ArrayList();
tiers.add(new Tier());
tiers.add(new Tier());
getBuilding().setTiers(tiers);
}
@Override
public void buildRoof() {
getBuilding().setRoof(new SlateRoof());
}
@Override
public void buildBasement() {
getBuilding().setBasement(new Basement());
}
}
Klasa odpowiedzialna za zarządzanie obiektem wzorca budowniczego.
public class ConstructionDirector {
private AbstractBuildingBuilder abb;
public void setBuilder(AbstractBuildingBuilder abb) {
this.abb = abb;
}
public Building getBuilding() {
return abb.getBuilding();
}
public void constructBuilding() {
abb.createBuilding();
abb.buildRoof();
abb.buildBasement();
abb.buildTiers();
}
}
Przykład użycia wzorca Budowniczego implementowanego przez klasy BobBuilder oraz SlateBuilder.
public class Main {
public static void main(String[] arg) {
ConstructionDirector director = new ConstructionDirector();
AbstractBuildingBuilder bob = new BobBuilder();
director.setBuilder(bob);
director.constructBuilding();
Building building = director.getBuilding();
System.out.println("BobBuilder build: ");
System.out.println(building.getDesign());
AbstractBuildingBuilder slate = new SlateBuilder();
director.setBuilder(slate);
director.constructBuilding();
building = director.getBuilding();
System.out.println("SlateBuilder build: ");
System.out.println(building.getDesign());
}
}
Wynik działania klasy Main:
BobBuilder build:
/---------\
| o o o |
| o o o |
| o o o |
| o o o |
| o o o |
_xxxxxxxxx_
SlateBuilder build:
/ \
/ \
/ \
/ \
/ \
| o o o |
| o o o |
_xxxxxxxxx_
Komentarze
Dodaj nowy komentarz