0

さまざまなコンポーネントを使用するレポートを実装しています。つまり、ヘッダー、フッター テーブルを持つものがあります。別のものには、ヘッダー、タイトル、表、グラフがあります。戦略パターンと同様のパターンを使用してこれを実装しました。同じクラスのレポートを使用してレポートを生成し、Component( onDraw ) を定義したインターフェイスを使用できます。各コンポーネントがテーブル、グラフなどを実装するのはどれですか...

しかし、メモリ消費と優れたソフトウェア設計のために、同じデータを持つ各レポートで使用されている場合、重複するテーブルとヘッダーを作成する必要はありません。1 つのレポートから描画されたテーブルとヘッダーを保存し、別のレポートで再利用するために使用できるパターンはありますか? フライウエイトパターンを見てきました。または、クラス レポートで静的変数を使用します。これに関する問題は、レポート クラスで異なるデータを使用したい場合です。

4

1 に答える 1

0

この質問をすることで、どの項目がレポート間で同じになるかを事前に判断することを妨げる、ランタイムの未知数があると思います。それ以外の場合は、同じインスタンスを直接参照できます。

「同等の」インスタンスをキャッシュするフライウェイト スタイルのファクトリは、メモリ フットプリントの削減に役立ちます。それぞれが、特定のデータフィールドをカプセル化し、 「同等」が何を意味するかを定義するためにReportComponent実装するために、ある種のパラメータオブジェクトを必要とします。equals()

public class ReportComponentFactory {

    private final Map<String, ReportComponent> headerCache = 
        new HashMap<String, ReportComponent>();
    private final Map<GraphParameters, ReportComponent> graphCache = 
        new HashMap<GraphParameters, ReportComponent>();

    public ReportComponent buildHeader(String headerText){
        if (this.headerCache.containsKey(headerText)){
            return this.headerCache.get(headerText);
        }
        Header newHeader = new Header(headerText);
        this.headerCache.put(headerText, newHeader);
        return newHeader;
    }

    public ReportComponent buildGraph(GraphParameters parameters){
        if (this.graphCache.containsKey(parameters)){
            return this.graphCache.get(parameters);
        }
        Graph newGraph = new Graph(parameters);
        this.graphCache.put(newGraph);
        return newGraph;
    }

    ...
}

パラメータ オブジェクトのインスタンス化には一時的なメモリの消費が必要になることに注意してください。ただし、ガベージ コレクションは簡単に行うことができます。

于 2013-04-17T03:13:38.053 に答える