あなたは非常に異なる2つのことを混乱させています。 GoFはBuilderを作成パターンとして分類し、Decoratorは構造パターンとして分類します。彼らは、(ガンマら、ページ1)を次のように記載されている:
ビルダー(97)と同じ構成プロセスが異なる表現を作成できるように、その表現から複雑なオブジェクトの構造を分離します。
デコレータ(175)オブジェクトに追加の責任を動的に付けます。 デコレータは、機能を拡張するためにサブクラス化する柔軟な代替手段を提供します。
デコレータに重点を置いています。サブクラス化の柔軟な代替方法です。サブクラス化は、is-a関係をモデル化するために使用されます。チーズはピザではありません。ピザはであり、成分の数はであり、これは通常組成物を用いてモデル化される。
ビルダーパターンは、標準化された方法でそれらを構築するために必要な膨大な数の成分が存在するため、ここでは関連しています。
デコレータの実例を取るために、私は最近、Javaアプリケーションでjdbcを使って実行されたクエリを記録したかったのです。これを実現するには、Connectionインターフェイスを拡張したLoggingConnectionというクラスを実装します。
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
...
}
これにより、具体的な接続の実装をパスし、実行時にその機能を拡張することができます。実際に返される接続オブジェクトが必ずしもわからないので、このコンテキストではサブクラス化は問題になります。それはあなたがDriverManagerの工場を使用するために構築されていますので、これは次のとおりです。
Connection conn = DriverManger.getConnection(dsn);
connオブジェクトは、このケースでは、私はgenerellyの名前を知らないドライバー、中に含まれる実装です。デコレータアプローチの利点は、私が知る必要はなく、特定の実装に結びついていないということです。ウィキペディアのDecoratorパターンの記事から
は、私は私が例でこれを学んだと同じ考えを持っていました。教授は私を助けることができませんでしたが、これは、ありがとう! – Mene