
Guía completa de patrones de diseño para desarrolladores Java
Estos patrones se centran en la creación de objetos, abstrayendo el proceso de instanciación.
Asegura que una clase tenga una única instancia y proporciona un punto global de acceso a ella.
Define una interfaz para crear un objeto, pero permite a las subclases decidir qué clase instanciar.
public class ConexionBD {
private static ConexionBD instancia;
private ConexionBD() {}
public static ConexionBD getInstancia() {
if (instancia == null) {
instancia = new ConexionBD();
}
return instancia;
}
}
Garantiza que solo exista una instancia de la clase en toda la aplicación
Proporciona un punto de acceso global a la instancia
Evita la creación de nuevas instancias desde fuera de la clase
public interface Transporte {
void entregar();
}
public class Camion implements Transporte {
public void entregar() {
System.out.println("Entrega en camión.");
}
}
public class TransporteFactory {
public static Transporte crearTransporte(String tipo) {
if ("camion".equals(tipo))
return new Camion();
throw new IllegalArgumentException("Tipo no soportado.");
}
}
Crear una interfaz común para todos los objetos
Desarrollar las clases concretas que implementan la interfaz
Implementar el método factory que decide qué clase instanciar
Se enfocan en la composición de clases y objetos para formar estructuras más complejas.
Permite que interfaces incompatibles trabajen juntas
Trata objetos individuales y compuestos de forma uniforme
Separa una abstracción de su implementación
Añade responsabilidades a objetos dinámicamente
Permite la interoperabilidad entre interfaces incompatibles
Facilita la integración de sistemas existentes
Permite reutilizar código existente sin modificarlo
Nuestro sistema espera un dispositivo USB estándar, pero a veces nos encontramos con dispositivos que no cumplen con esa interfaz.
El Patrón Adapter nos permite convertir un dispositivo incompatible, como una tarjeta SD, en uno que sí funcione con nuestro sistema.
El adaptador encapsula la lógica necesaria para hacer que la tarjeta SD se comporte como un dispositivo USB, ocultando los detalles de implementación.
// Esta es la interfaz que espera nuestro sistema
public interface DispositivoUSB {
void conectarUSB();
}
// Esta es una clase que representa una tarjeta SD, que no tiene conector USB
public class TarjetaSD {
public void insertar() {
System.out.println("Tarjeta SD insertada.");
}
}
// Este es el adaptador que convierte una tarjeta SD en un dispositivo USB
public class AdaptadorSDaUSB implements DispositivoUSB {
private TarjetaSD tarjeta;
public AdaptadorSDaUSB(TarjetaSD tarjeta) {
this.tarjeta = tarjeta;
}
@Override
public void conectarUSB() {
tarjeta.insertar(); // Adaptamos la interfaz
}
}
// Simulación del uso
public class Main {
public static void main(String[] args) {
TarjetaSD sd = new TarjetaSD();
DispositivoUSB adaptador = new AdaptadorSDaUSB(sd);
adaptador.conectarUSB(); // El sistema cree que es un USB, pero es una SD adaptada
}
}
public interface Componente {
void mostrar();
}
public class Archivo implements Componente {
private String nombre;
public Archivo(String nombre) {
this.nombre = nombre;
}
public void mostrar() {
System.out.println("Archivo: " + nombre);
}
}
public class Carpeta implements Componente {
private String nombre;
private List hijos = new ArrayList<>();
public Carpeta(String nombre) {
this.nombre = nombre;
}
public void agregar(Componente c) {
hijos.add(c);
}
public void mostrar() {
System.out.println("Carpeta: " + nombre);
for (Componente c : hijos) {
c.mostrar();
}
}
}
Define operaciones comunes para todos los componentes
Implementan la interfaz para objetos individuales
Contienen y gestionan componentes hijos
Uso ejemplo:
public class Main {
public static void main(String[] args) {
Carpeta raiz = new Carpeta("Documentos");
Carpeta fotos = new Carpeta("Fotos");
Carpeta trabajo = new Carpeta("Trabajo");
Archivo foto1 = new Archivo("vacaciones.jpg");
Archivo foto2 = new Archivo("cumpleaños.png");
Archivo doc1 = new Archivo("informe.docx");
fotos.agregar(foto1);
fotos.agregar(foto2);
trabajo.agregar(doc1);
raiz.agregar(fotos);
raiz.agregar(trabajo);
raiz.mostrar();
}
}Salida:
Documentos
├── Fotos
│ ├── vacaciones.jpg
│ └── cumpleaños.png
└── Trabajo
└── informe.docxGracias al patrón Composite podemos tratar del mismo modo Archivos y Carpetas
Se ocupan de la comunicación entre objetos. Los patrones Observer y Strategy son ejemplos destacados que facilitan la interacción entre componentes de software.

Patrones de diseño en Java