В чем разница между шаблоном проектирования Flyweight и Java-кешем
Я прочитал о шаблоне проектирования Flyweight и узнал, что в нем хранятся объекты, которыми можно поделиться, чтобы сэкономить на использовании кучи. Java-кеш также сохраняет объекты, которые можно использовать позже для экономии памяти. Тогда в чем реальная разница между шаблоном разработки Flyweight и Java-кешем?
3 ответа
Давайте предположим, что "Java cache" - это пул объектов (или шаблон пула объектов).
Я думаю, что разница заключается в понимании того, что кэшируемые объекты являются одноэлементными или нет.
В шаблоне flyweight вы используете один и тот же объект, извлеченный из "фабрики" потенциально несколькими клиентами. Это требует другого способа управления вещами (например, параллелизм, работа с клиентом и т. Д.). Например, если вы извлекаете один и тот же объект-груз (скажем, кнопку) в нескольких клиентских интерфейсах / окнах просмотра, которые видны одновременно, то вы в конечном итоге будете манипулировать одним и тем же объектом (например, текстом кнопки), что может привести к несогласованности на этих различных интерфейсах / окнах просмотра. Этого не произойдет, поскольку пул / кэш будет возвращать вам отдельный объект каждый раз, когда вы запрашиваете объект.
Что касается неизменяемости, я встречал в сети несколько примеров, которые включают в себя внешнее / изменяющееся состояние в объекте flyweight. Что ж, я не думаю, что совершенно неправильно включать его как часть объекта с навесным весом, так как дело в том, чтобы уменьшить объем памяти, если вы можете правильно управлять объектами. Но я также думаю, что это полностью открыто для обсуждения.
Дизайн Flyweight - это, как правило, магазин неизменяемых предметов.
"Java-кеш" не является четко определенным термином. Это может означать много вещей, таких как кэш результатов или пул объектов ресурсов.
Шаблон Flyweight - это шаблон структурного дизайна, который влияет на структурный дизайн ваших объектов. Ключевыми моментами в этом шаблоне проектирования является совместное и необщедоступное состояние. Совместно используемое состояние хранится в объектах Flyweight (поскольку оно не зависит от контекста). Также может существовать внешнее состояние, которое нельзя разделить, и бремя определения этого состояния ложится на клиента, так как это зависит от контекста.
Теперь вы можете использовать кэширование для реализации шаблона Flyweight, но кэширование в целом не имеет ничего общего с шаблоном Flyweight как таковым. Идея кэширования имеет больший контекст в том, что она полезна для экономии ваших вычислительных ресурсов (ЦП / память / сеть) за счет повторного использования.