Шаблон мухи - как хранить весы в структуре данных?
Пример реализации классического шаблона Flyweight из книги GoF хранит код символа только для разделяемых "символов" и использует "GlyphContext" для хранения внешнего состояния в древовидной структуре. В этом примере также упоминаются строки и столбцы, однако в нем не упоминается, как хранить "коллекцию" маховиков (объекты "персонажей").
Ясно, что этот шаблон позволяет избежать создания огромного количества объектов путем совместного использования экземпляров, но как можно создать структуру таких объектов (например, для представления документа), не создавая структуру ссылок на кэшированные объекты (что приведет к аннулированию цель шаблона)? Я вижу, что в других примерах кэшированные экземпляры используются в качестве "одноразовых" объектов, без создания какой-либо структуры, но, похоже, это не имеет никакого смысла, поскольку его можно заменить набором статических операций.
Правильно ли сделать вывод, что если нужно ссылаться на маховики после их создания, выгода шаблона может быть грубо рассчитана как [размер внутреннего состояния]/[размер ссылки на объект]. Это означает, что вес в полете только с одним полем не имеет смысла?
РЕДАКТИРОВАТЬ: я был не прав в моих "вычислениях памяти"... Без маховиков, вы все равно должны хранить ссылки, но с маховиками, вам больше не нужно хранить объекты. Основная мысль вопроса все еще остается верной - степень экономии, обеспечиваемая шаблоном, пропорциональна размеру внутреннего состояния, а не количеству "логических объектов". Правда или ложь?
1 ответ
Да, даже один объект типа flyweight имеет смысл, если вы будете часто его использовать. Это быстрее, чтобы получить их экземпляры, а затем создавать новые объекты.
я нахожу Map <string name, Object yourobject>
(на Java) хороший способ их хранения. Почему вам нужно "без структуры"?
Использование некоторой структуры для хранения данных об использовании мухи не отменяет назначение шаблона. Вам нужно несколько экземпляров flywieghts, чтобы использовать их. Вы можете сделать их во время выполнения и добавить их в список (так должно быть, чтобы избежать ненужных объектов), или вы можете подготовить их до выполнения (ведь это имеет "низкий" смысл).