我假设通过问这个问题存在运行时未知数,这些未知数会阻止您提前确定哪些项目在报告中是相同的。否则,您可以直接引用相同的实例。
缓存“等效”实例的享元式工厂可以帮助减少内存占用。每个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;
}
...
}
请注意,实例化参数对象将需要一些临时内存消耗,但它们应该很容易被垃圾收集。