El patrón Builder, también conocido como patrón de construcción, se utiliza para ensamblar instancias con estructuras complejas.
Ejemplo práctico: generación de un documento con formato específico que incluye título, texto y listas. El patrón se compone de tres componentes pricnipales:
package com.ejemplo.patrones.builder;
/**
* Interfaz central del patrón constructor
* Define los métodos necesarios para crear una estructura compleja
*/
public interface Constructor {
/**
* Método para crear el encabezado del documento
* @param titulo texto del encabezado
*/
void crearEncabezado(String titulo);
/**
* Método para agregar contenido textual
* @param texto contenido a añadir
*/
void agregarTexto(String texto);
/**
* Método para generar listas
* @param elementos array de elementos para la lista
*/
void generarLista(String[] elementos);
/**
* Método final para completar la construcción
*/
void finalizar();
}
package com.ejemplo.patrones.builder;
/**
* Clase que coordina la construcción del documento
* Utiliza polimorfismo para trabajar con distintos tipos de constructores
*/
public class Coordinador {
private Constructor constructor;
public Coordinador(Constructor constructor) {
this.constructor = constructor;
}
public void construirDocumento() {
constructor.crearEncabezado("Introducción");
constructor.agregarTexto("Este es un ejemplo de patrón de construcción");
constructor.generarLista(new String[]{"Punto 1", "Punto 2"});
constructor.agregarTexto("Conclusión");
constructor.finalizar();
}
}
package com.ejemplo.patrones.builder;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* Implementación específica para archivos HTML
*/
public class ConstructorHTML implements Constructor {
private StringBuilder contenido = new StringBuilder();
@Override
public void crearEncabezado(String titulo) {
contenido.append("\n<html>\n<head>\n<title>").append(titulo).append("</title>\n</head>\n<body>\n");
}
@Override
public void agregarTexto(String texto) {
contenido.append("<p>").append(texto).append("</p>\n");
}
@Override
public void generarLista(String[] elementos) {
contenido.append("\\n"); for (String elemento : elementos) { contenido.append(" - ").append(elemento).append("
\\n"); } contenido.append("\n");
}
@Override
public void finalizar() {
contenido.append("</body>\n</html>");
try (FileWriter escritor = new FileWriter("documento.html")) {
escritor.write(contenido.toString());
} catch (IOException e) {
e.printStackTrace();
}
}
}
package com.ejemplo.patrones.builder;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* Implementación específica para archivos TXT
*/
public class ConstructorTXT implements Constructor {
private StringBuilder contenido = new StringBuilder();
@Override
public void crearEncabezado(String titulo) {
contenido.append("========================================\n");
contenido.append("[" + titulo + "]\n");
contenido.append("========================================\n\n");
}
@Override
public void agregarTexto(String texto) {
contenido.append("[.] ").append(texto).append("\n\n");
}
@Override
public void generarLista(String[] elementos) {
for (String elemento : elementos) {
contenido.append("\t").append(elemento).append("\n");
}
contenido.append("\n");
}
@Override
public void finalizar() {
contenido.append("========================================");
try (FileWriter escritor = new FileWriter("documento.txt")) {
escritor.write(contenido.toString());
} catch (IOException e) {
e.printStackTrace();
}
}
}
package com.ejemplo.patrones.builder;
public class Prueba {
public static void main(String[] args) {
// Ejecución con constructor TXT
Constructor constructorTXT = new ConstructorTXT();
Coordinador coordinadorTXT = new Coordinador(constructorTXT);
coordinadorTXT.construirDocumento();
// Ejecución con constructor HTML
Constructor constructorHTML = new ConstructorHTML();
Coordinador coordinadorHTML = new Coordinador(constructorHTML);
coordinadorHTML.construirDocumento();
}
}
Resultado: se crearon dos archivos en la carpeta raíz - documento.txt y documento.html - sin errores durante la ejecución.