Introducció al Patró Builder
El patró Builder és un patró creacional que permet la construcció d'objectes complexos pas a pas. A diferència d'altres patrons creacionals que enfoquen la creació d'objectes a partir d'una interfície comuna, el Builder separa la construcció d'un objecte de la seva representació, permetent crear diferents representacions de l'objecte utilitzant el mateix procés de construcció.
Quan Utilitzar el Patró Builder
- Quan la creació d'un objecte implica molts passos o configuracions.
- Quan es vol evitar la complexitat de constructors amb molts paràmetres.
- Quan es vol crear diferents representacions d'un mateix objecte.
Components del Patró Builder
- Builder: Defineix una interfície abstracta per crear parts d'un objecte Producte.
- ConcreteBuilder: Implementa la interfície Builder i construeix les parts específiques del Producte.
- Product: Representa l'objecte complex que es construeix.
- Director: Controla el procés de construcció utilitzant un objecte Builder.
Exemple Pràctic
A continuació, es presenta un exemple pràctic del patró Builder en Java. Suposem que volem construir una casa amb diferents característiques com ara el nombre de finestres, portes, i el tipus de sostre.
Definició del Producte
public class House { private int windows; private int doors; private String roofType; public void setWindows(int windows) { this.windows = windows; } public void setDoors(int doors) { this.doors = doors; } public void setRoofType(String roofType) { this.roofType = roofType; } @Override public String toString() { return "House [windows=" + windows + ", doors=" + doors + ", roofType=" + roofType + "]"; } }
Definició del Builder
public abstract class HouseBuilder { protected House house; public House getHouse() { return house; } public void createNewHouse() { house = new House(); } public abstract void buildWindows(); public abstract void buildDoors(); public abstract void buildRoof(); }
Implementació del ConcreteBuilder
public class ConcreteHouseBuilder extends HouseBuilder { @Override public void buildWindows() { house.setWindows(4); } @Override public void buildDoors() { house.setDoors(2); } @Override public void buildRoof() { house.setRoofType("Gable"); } }
Definició del Director
public class HouseDirector { private HouseBuilder houseBuilder; public HouseDirector(HouseBuilder houseBuilder) { this.houseBuilder = houseBuilder; } public void constructHouse() { houseBuilder.createNewHouse(); houseBuilder.buildWindows(); houseBuilder.buildDoors(); houseBuilder.buildRoof(); } public House getHouse() { return houseBuilder.getHouse(); } }
Utilització del Patró Builder
public class BuilderPatternDemo { public static void main(String[] args) { HouseBuilder builder = new ConcreteHouseBuilder(); HouseDirector director = new HouseDirector(builder); director.constructHouse(); House house = director.getHouse(); System.out.println(house); } }
Exercicis Pràctics
Exercici 1: Crear un Vehicle
Descripció: Implementa el patró Builder per construir un objecte Vehicle amb les següents característiques: nombre de rodes, tipus de motor, i color.
Solució:
- Definició del Producte
public class Vehicle { private int wheels; private String engineType; private String color; public void setWheels(int wheels) { this.wheels = wheels; } public void setEngineType(String engineType) { this.engineType = engineType; } public void setColor(String color) { this.color = color; } @Override public String toString() { return "Vehicle [wheels=" + wheels + ", engineType=" + engineType + ", color=" + color + "]"; } }
- Definició del Builder
public abstract class VehicleBuilder { protected Vehicle vehicle; public Vehicle getVehicle() { return vehicle; } public void createNewVehicle() { vehicle = new Vehicle(); } public abstract void buildWheels(); public abstract void buildEngine(); public abstract void buildColor(); }
- Implementació del ConcreteBuilder
public class CarBuilder extends VehicleBuilder { @Override public void buildWheels() { vehicle.setWheels(4); } @Override public void buildEngine() { vehicle.setEngineType("V8"); } @Override public void buildColor() { vehicle.setColor("Red"); } }
- Definició del Director
public class VehicleDirector { private VehicleBuilder vehicleBuilder; public VehicleDirector(VehicleBuilder vehicleBuilder) { this.vehicleBuilder = vehicleBuilder; } public void constructVehicle() { vehicleBuilder.createNewVehicle(); vehicleBuilder.buildWheels(); vehicleBuilder.buildEngine(); vehicleBuilder.buildColor(); } public Vehicle getVehicle() { return vehicleBuilder.getVehicle(); } }
- Utilització del Patró Builder
public class BuilderPatternVehicleDemo { public static void main(String[] args) { VehicleBuilder builder = new CarBuilder(); VehicleDirector director = new VehicleDirector(builder); director.constructVehicle(); Vehicle vehicle = director.getVehicle(); System.out.println(vehicle); } }
Resum
El patró Builder és una eina poderosa per a la creació d'objectes complexos de manera controlada i flexible. Permet separar la construcció d'un objecte de la seva representació, facilitant la creació de diferents versions d'un mateix objecte. A través d'aquest mòdul, hem explorat la seva estructura, components i aplicació pràctica amb exemples detallats.
Curs de Patrons de Disseny de Programari
Mòdul 1: Introducció als Patrons de Disseny
- Què són els Patrons de Disseny?
- Història i Origen dels Patrons de Disseny
- Classificació dels Patrons de Disseny
- Avantatges i Desavantatges d'Usar Patrons de Disseny
Mòdul 2: Patrons Creacionals
Mòdul 3: Patrons Estructurals
Mòdul 4: Patrons de Comportament
- Introducció als Patrons de Comportament
- Chain of Responsibility
- Command
- Interpreter
- Iterator
- Mediator
- Memento
- Observer
- State
- Strategy
- Template Method
- Visitor
Mòdul 5: Aplicació de Patrons de Disseny
- Com Seleccionar el Patró Adequat
- Exemples Pràctics d'Ús de Patrons
- Patrons de Disseny en Projectes Reals
- Refactorització Usant Patrons de Disseny
Mòdul 6: Patrons de Disseny Avançats
- Patrons de Disseny en Arquitectures Modernes
- Patrons de Disseny en Microserveis
- Patrons de Disseny en Sistemes Distribuïts
- Patrons de Disseny en Desenvolupament Àgil