Mylą dwie bardzo różne rzeczy. GoF klasyfikuje Builder jako wzorzec kreacji, podczas gdy Dekorator jest strukturalny. Są one opisane w następujący sposób (gamma i inni, strona 1)
Konstruktor (97) oddzielenie konstrukcji zespolonej obiektu z reprezentacji tak że ten sam proces budowy można tworzyć różne reprezentacje.
Dekorator (175) Dynamiczne przypisywanie dodatkowych obowiązków do obiektu. Dekoratory stanowią elastyczną alternatywę dla podklasy w celu rozszerzenia funkcjonalności.
Uwaga na nacisk na dekoratora. Jest elastyczną alternatywą dla podklasy. Podklasy są używane do modelowania relacji is-a. Ser nie jest pizzą. Pizza jest skomponowana z wielu składników i zazwyczaj jest modelowana za pomocą kompozycji.
Wzorzec budowniczy ma tu znaczenie, ponieważ istnieje tak duża liczba składników, że powstaje potrzeba ich skonstruowania w znormalizowany sposób.
Aby zrobić prawdziwy przykład dekoratora, niedawno chciałem zarejestrować zapytania wykonane przy użyciu jdbc w mojej aplikacji java. Osiągnąłem to poprzez wdrożenie klasy o nazwie LoggingConnection, która rozszerzyła interfejs połączenia.
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
...
}
Pozwala mi to przekazać konkretną implementację połączenia i rozszerzyć jego funkcjonalność w czasie wykonywania. Tworzenie podklas może być problematyczne w tym kontekście, ponieważ niekoniecznie wiesz, jaki obiekt połączenia jest faktycznie zwracany. To dlatego, że jest zbudowany na używasz fabrykę DriverManager:
Connection conn = DriverManger.getConnection(dsn);
Conn obiekt jest w tym przypadku realizacja zawartych w sterowniku, który ja generelly nie znam nazwy. Ideą dekoratora jest to, że nie muszę wiedzieć i że nie jest on związany z konkretną realizacją.
miałem tę samą myśl, kiedy dowiedział się o tym na przykładzie. Profesor nie mógł mi pomóc, ale tak jest, dziękuję! – Mene