В чем разница между внутренним и внешним состоянием, как описано в шаблоне Flyweight?
Из главы о FlyWeight
Шаблон внутри " Банды четырех" Шаблон "FlyWeight" применим, когда большинство состояний объекта можно сделать внешними.
Что значит extrinsic state
имею в виду? У меня такое ощущение, что этот шаблон используется для обмена объектами. Если объекты должны совместно использоваться, то как этот объект может вообще иметь какое-либо состояние?
3 ответа
Какой бы ни была конкретная формулировка в этом маркированном списке, важно понимать сообщение: Flyweight применяется в том случае, когда важная часть данных может быть разделена между многими объектами, потому что она неизменна. Пример с гранями шрифта проясняет это; пример из повседневной Java java.util.regex.Pattern
, обладатель неизменного внешнего состояния, против Matcher
Мухи, который использует его и имеет локальное внутреннее состояние. Много Matcher
Они могут существовать параллельно, все повторно используя скомпилированное регулярное выражение внутри.
Эта цитата проясняет ситуацию, чем вопрос из вашего вопроса:
Чем больше маховиков, тем больше экономия на хранении. Экономия увеличивается с количеством общего состояния. Наибольшая экономия происходит, когда объекты используют значительные количества как собственного, так и внешнего состояния, и внешнее состояние может быть вычислено, а не сохранено. Затем вы экономите на хранении двумя способами: совместное использование снижает стоимость внутреннего состояния, и вы торгуете внешним состоянием для времени вычислений.
Давайте рассмотрим пример текстового процессора:
Текстовый процессор работает с объектами символов. Состояние объектов Character - это содержимое символа, шрифт, стиль, местоположение и т. Д. (В том, что касается текстового процессора). В разных документах используются разные экземпляры символа. Предполагая, что мы имеем дело только с аз- символами, в разных документах используются буквы из пула аз, но может применяться другой шрифт / стиль. Таким образом, если мы отделяем содержимое символа от шрифта / стиля, мы можем разделить эти символы, и это имеет смысл, потому что общее количество различных типов символов меньше (в нашем случае 26, но константа в противном случае) по сравнению с различными экземплярами используемых символов. в разных документах. Совместное использование этих экземпляров символов будет означать совместное использование содержимого экземпляров символов и применение к ним внешнего вида, такого как шрифт / стиль. Содержимое символа является внутренним состоянием, а шрифт / стиль - внешним состоянием. Разделение состояния на собственное и внешнее состояния привело к огромной экономии памяти в приведенном выше примере.
extrinsic - состояние, которое принадлежит контексту объекта (внешнему) или уникально для этого экземпляра
intrinsic - состояние, которое естественно принадлежит объекту "FlyWeight" и поэтому должно быть постоянным или неизменным (внутренним) или не зависящим от контекста.
Шаблон проектирования Flyweight от Gang of Four представляет концепцию внутреннего и внешнего состояний:
Ключевой концепцией здесь является различие между внутренним и внешним состоянием. Внутреннее состояние хранится в весе; он состоит из информации, не зависящей от контекста легковеса, что делает ее доступной для совместного использования. Внешнее состояние зависит от контекста наилегчайшего веса и зависит от него, поэтому не может быть передано другим лицам. Клиентские объекты отвечают за передачу внешнего состояния легковесу, когда ему это нужно.
Другими словами, состояние объекта можно разложить по группе объектов на внутреннее состояние и внешнее состояние, где внутреннее состояние - это пересечение состояний всех объектов группы, а внешнее состояние - это внутреннее состояние. различие состояния объекта и внутреннего состояния. Поскольку внутреннее состояние дублируется в каждом объекте группы, можно сэкономить место, заменив группу объектов одним грузиком. объект, хранящий единственное внутреннее состояние. Однако объект-легковес не может хранить несколько внешних состояний объектов группы, поэтому внешние состояния хранятся снаружи и передаются объекту-легковесу в каждом запросе от клиентских объектов. Такой оптимизированный протокол связи часто называют протоколом без сохранения состояния, поскольку объект-легковес не хранит внешнее состояние. Примеры протоколов без сохранения состояния включают IP и HTTP (и вообще любые протоколы REST, где внутреннее состояние называется состоянием ресурса, а внешнее состояние называется состоянием приложения).
Например, возьмем три объекта с соответствующими клиентами:
o1 ← c1
o2 ← c2
o3 ← c3
Мы можем разложить состояние каждого объекта по трем объектам:
состояние 1 = внутреннее состояние ∪ внешнее состояние 1
состояние 2 = внутреннее состояние ∪ внешнее состояние 2
состояние 3 = внутреннее состояние ∪ внешнее состояние 3где:
внутреннее состояние = состояние 1 ∩ состояние 2 ∩ состояние 3
внешнее состояние 1 = состояние 1 \ внутреннее состояние
внешнее состояние 2 = состояние 2 \ внутреннее состояние
внешнее состояние 3 = состояние 3 \ внутреннее состояние
Здесь внутреннее состояние дублируется. Таким образом, хранение его в одном легковесном объекте (и перенос внешних состояний в клиентов) экономит место:
o ← c1, c2, c3