Estás confundiendo dos cosas muy diferentes. GoF clasifica el Constructor como un patrón de creación, mientras que el Decorador es un patrón estructural. Se describen como sigue (Gamma et al, página 1):
Generador de (97) Separar la construcción de un objeto complejo de su representación para que el mismo proceso de construcción puede crear diferentes representaciones.
Decorador (175) Agregue responsabilidades adicionales a un objeto dinámicamente. Los decoradores proporcionan una alternativa flexible a las subclases para ampliar la funcionalidad.
Tenga en cuenta el énfasis en el decorador. Es una alternativa flexible a la subclasificación. Las subclases se usan para modelar una relación is-a. El queso no es una pizza. La pizza es compuesta de una serie de ingredientes, y que generalmente se modela utilizando composición.
El patrón del generador es relevante aquí porque hay una gran cantidad de ingredientes que se necesitan para construirlos de manera estandarizada.
Para tomar un ejemplo del mundo real de un decorador, recientemente quise registrar las consultas ejecutadas usando jdbc en mi aplicación java. Lo logré implementando una clase llamada LoggingConnection que extendió la interfaz de Connection.
public class LoggingConnection implements Connection
{
public static class LogEntry
{
public String sql;
public int invocationCount;
public double avgTime;
public double maxTime;
}
private Connection delegate;
private Map<String, LogEntry> log;
public LoggingConnection(Connection delegate)
{
this.delegate = delegate;
this.log = new HashMap<String, LogEntry>();
}
public Map<String, LogEntry> getLog()
{
return log;
}
@Override
public void clearWarnings()
throws SQLException
{
delegate.clearWarnings();
}
@Override
public void close()
throws SQLException
{
delegate.close();
}
// forwarding declarations to all other methods declared in the interface
...
}
Esto me permite aprobar una implementación concreta de una conexión, y ampliar su funcionalidad en tiempo de ejecución. La creación de subclases sería problemática en este contexto, ya que no necesariamente se sabe qué objeto de conexión realmente se devuelve. Esto se debe a que está construido para usted, utilizando la fábrica DriverManager:
objeto
Connection conn = DriverManger.getConnection(dsn);
El conn es en este caso una aplicación contenida en el controlador, que generelly no sé el nombre de. El objetivo del enfoque de decorador es que no tengo que saberlo, y que no está vinculado a una implementación específica.
que tenían el mismo pensamiento cuando me enteré de esto con el ejemplo. El profesor no pudo ayudarme, pero esto sí, ¡gracias! – Mene