Я реализую отчет, который будет использовать различные компоненты, то есть некоторые имеют заголовок, таблицу нижнего колонтитула. У другого есть заголовок, заголовок, таблица, график. Я реализовал это, используя шаблон, аналогичный шаблону стратегии. Я могу сгенерировать отчет, используя тот же классный отчет, и иметь интерфейс, определенный Component (onDraw). Какой каждый компонент реализует Table, Graph и т. Д.
Но для потребления памяти и хорошего дизайна программного обеспечения я не хочу создавать дубликаты таблиц и заголовков, если они используются в каждом отчете с одинаковыми данными. Можно ли использовать шаблон для сохранения нарисованной таблицы и заголовка из одного отчета и повторного использования для другого отчета? Я смотрел на образец веса мухи. Или используя статические переменные в отчете о классе. Проблема заключается в том, что я хочу использовать разные данные в классе отчета.
Я предполагаю, что при задании этого вопроса существуют неизвестные во время выполнения, которые не позволяют вам заранее определить, какие элементы будут одинаковыми в отчетах. В противном случае вы можете просто ссылаться на одни и те же экземпляры напрямую.
Фабрика в стиле flyweight, которая кэширует «эквивалентные» экземпляры, может помочь уменьшить объем используемой памяти. каждый 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;
}
...
}
Обратите внимание, что создание экземпляров объектов параметров потребует некоторого временного потребления памяти, но их следует собирать достаточно просто.
Других решений пока нет …