Шаблон Java Flyweight: внешние и внутренние состояния?
Я запутался между разницей этих состояний для Flyweight
шаблон.
Я знаю что intrinsic
состояние является государством, которое является общим и Extrinsic
не является.
Однако я не вижу важности extrinsic
состояние в шаблоне или в примере ниже:
public static void main(String[] args) {
// Create the flyweight factory...
EngineFlyweightFactory factory = new EngineFlyweightFactory();
// Create the diagnostic tool
DiagnosticTool tool = new EngineDiagnosticTool();
// Get the flyweights and run diagnostics on them
Engine standard1 = factory.getStandardEngine(1300); //intrinsic
standard1.diagnose(tool); //extrinsic
Engine standard2 = factory.getStandardEngine(1300); //intrinsic
standard2.diagnose(tool); //extrinsic
Engine standard3 = factory.getStandardEngine(1300); //intrinsic
standard3.diagnose(tool); //extrinsic
Engine standard4 = factory.getStandardEngine(1600); //intrinsic
standard4.diagnose(tool); //extrinsic
Engine standard5 = factory.getStandardEngine(1600); //intrinsic
standard5.diagnose(tool); //extrinsic
Ссылка на пример, приведенный в Википедии о редакторе текста. Является ли внутреннее состояние буквой, а внешнее - шрифтом, цветом и т. Д.?
1 ответ
Шаблон flyweight - это способ справиться с ситуацией, когда то, что вы пытаетесь выполнить, использует много объектов одного типа. Вместо того, чтобы каждый раз создавать новый экземпляр объекта, шаблон flyweight повторно использует объекты, требуя только отслеживания различий в их использовании. Текстовый процессор - классический пример. Из вашего примера из Википедии:
Может быть желательно иметь для каждого символа в документе объект глифа, содержащий его схему шрифта, метрики шрифта и другие данные форматирования, но это будет составлять сотни или тысячи байтов для каждого символа. Вместо этого для каждого символа может существовать ссылка на объект глифа с навесным весом, общий для каждого экземпляра одного и того же символа в документе; только положение каждого символа (в документе и / или на странице) должно быть сохранено внутри.
Это точное описание того, как шаблон будет использоваться. Следуя вашему внутреннему / внешнему различию, объекты глифа будут внутренним состоянием, а расположение этих объектов (например, на какой странице, абзаце и строке они появляются) будет внешним состоянием / использованием объекта.
От вашего вопроса, где, я думаю, вы запутались в примере, это то, что можно считать внешним / внутренним атрибутом. Вероятно, это связано с тем, что описываемые вами атрибуты, стиль шрифта, цвета шрифта и шрифт будут повторно использоваться как часть шаблона flyweight и поэтому будут "внутренними" в том смысле, что они являются частью шаблона flyweight, но "внешними" в ощущение, что вы бы объяснили их применение к конкретным буквам слов. Например, в текстовом редакторе у вас, вероятно, будет набор глифов для разных шрифтов, выделенных жирным шрифтом, курсивом и т. Д.; Коллекция доступных цветов также может быть применена и использована повторно. Затем программа будет отслеживать, где эти атрибуты были применены, но они не будут чисто внешними состояниями, как вы описали выше.
Что касается вашего кода выше, я не уверен, как он вписывается в пример flyweight, не видя никакого кода позади него. Но из того, что я могу сказать, это похоже на пример кафе из статьи в Википедии, на которую вы ссылались. Число, независимо от того, что представляет это значение, является уникальным для объекта, который используется повторно.
Вы должны попытаться получить копию оригинальной банды из четырех книг по шаблонам дизайна. В книге подробно рассматривается пример текстового процессора, и я помогу вам лучше понять, как работает шаблон.