0

我正在实现一个将使用不同组件的报告,即有些组件具有页眉、页脚表。另一个有标题、标题、表格、图表。我使用与策略模式类似的模式实现了这一点。我可以使用相同的类报告生成报告,并定义一个接口组件(onDraw)。每个组件都实现了 Table、Graph 等...

但是对于内存消耗和良好的软件设计,如果在每个具有相同数据的报告上使用它们,我不想创建重复的表和标题。是否有一种模式可用于将绘制的表格和标题从一个报告中保存下来并重新用于另一个报告?我一直在研究飞重模式。或者在课堂报告中使用静态变量。问题是当我想在报告类上使用不同的数据时。

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 回答