В книге доктора Яна Хонга "Java и Mode" она начинается с описания режима в полусреднем весе:
Тязкий вес относится к самым легким уровням веса, то есть «в весе» или «уровне дождя». Перевод «режима Xienyuan» выбран здесь, потому что это может лучше отражать намерение режима. Схема энциклопедии является структурной паттерной объекта. Режим энциклопедии эффективно поддерживает большое количество мелкозернистых объектов общим образом.
Тип строки в Java
На языке Java тип строки использует режим энциклопедии. Строковой объект имеет конечный тип и не может быть изменен после его создания. В Java константы струны присутствуют в постоянном бассейне. Java гарантирует, что строковая константа имеет только одну копию в постоянном пуле. String a = "ABC", где "ABC" - это строка постоянная.
открытый тест класса {public static void main (string [] args) {string a = "abc"; Строка b = "ABC"; System.out.println (a == b); }}Результат в приведенном выше примере является истинным, что означает, что как A, так и B относятся к одной и той же строке «ABC» в постоянном пуле. Такой дизайн позволяет избежать ненужных больших объемов потребления ресурсов, генерируемых при создании n или более идентичных объектов.
Структура модели удовольствия
Модель наслаждения принимает обмен, чтобы избежать накладных расходов на наличие одного и того же объекта контента. Самая распространенная и интуитивная вещь в этом накладном расходе - потеря памяти. Ключом к обмену объектом энциклопедии является различие между внутренним состоянием и внешним состоянием .
Внутреннее состояние хранится внутри объекта Сянгюан и не будет варьироваться в зависимости от окружающей среды. Следовательно, жертвенный элемент может иметь внутреннее состояние и может быть разделен.
Внешнее состояние меняется с изменением окружающей среды и не может быть обмен. Внешнее состояние объекта Сянгюанна должно быть сохранено клиентом, и после создания Сяньгюанского объекта он передается в объект Сяньгюан, когда его необходимо использовать. Внешние состояния не могут влиять на внутреннее состояние живого объекта, они не зависят друг от друга.
В режиме наслаждения юаней можно разделить на две формы: режим наслаждения юаней и композитный режим Yuan.
Простой режим удовольствия
В простом режиме существующего, все существующие объекты могут быть обмены.
Роли, связанные с простым режимом удовольствия, заключаются в следующем:
Аннотация Роль в полусреднем весе: дает абстрактный интерфейс, чтобы указать методы, которые необходимо реализовать все специфические роли в полусреднем весе.
Роль бетона в весе: реализует интерфейс, указанный в абстрактной роли Сяньгюан. Если есть внутреннее состояние, вы должны нести ответственность за предоставление места для хранения для внутреннего состояния.
Роль Flayweew -Factory: эта роль отвечает за создание и управление роли Сянгюан. Эта роль должна гарантировать, что объект удовольствия может быть должным образом разделен системой. Когда объект клиента вызывает Xiangyuan объекта, роль Сяньгюанна заворачивается, будет ли уже есть объект Xiangyuan, который соответствует требованиям в системе. Если это уже существует, роль Сяньгьюанской фабрики должна обеспечить существующий объект Сянгюань; Если в системе нет соответствующего объекта Сяньгьюань, роль Сяньгьюанской фабрики должна создать подходящий объект Сянгюан.
исходный код
Абстрактный класс персонажей
Общедоступный интерфейс, вылетенный {// схематический метод, состояние параметра - это внешняя операция общедоступной void (String State);}Специфическая энциклопедия персонажа Croncetefly -Fellowse имеет внутреннее состояние. В этом примере представляет собой свойство типа символа, и его значение должно быть назначено при создании объекта энциклопедии. Все внутренние состояния не будут изменяться после создания объекта.
Если жертвенный объект имеет внешнее состояние, все внешние состояния должны храниться на клиенте. При использовании жертвенного объекта жертвенный объект будет передаваться в жертвенный объект клиентом. Здесь есть только одно внешнее состояние, а состояние параметра метода операции () - это внешнее состояние, передаваемое извне.
Общедоступный класс ConcreteFly -вес реализует пробег {частный символ Intrinsicstate = null; / *** Конструктор, внутреннее состояние передается как параметр* @param wation*/ public concretefly -вес (состояние символа) {this.intrinsicstate = state; } /** * Внешнее состояние передается в качестве параметра в метод, изменяя поведение метода *, но не изменяет внутреннее состояние объекта. */ @Override public void Operation (String State) {// TODO Автогенерированный метод STUB System.out.println ("Intrinsic state =" + this.intrinsicstate); System.out.println ("внешнее состояние =" + state); }}Для класса ролевых ролей Сяньгьюана следует отметить, что клиент не может напрямую создавать конкретный класс Сянгюан, но должен использовать метод Factory () для получения объекта Xiangyuan. Вообще говоря, во всей системе существует только один объект Xiangyuan, поэтому также можно использовать режим Singleton.
Когда клиенту нужен простой объект удовольствия, ему необходимо назвать метод Factory () на заводе наслаждаться и передать необходимое внутреннее состояние фабрики наслаждения, а метод завода генерирует требуемый объект наслаждения.
Public Class FlywailainFactory {Private Map <символ, Flyweight> Files = new HashMap <символ, летящий вес> (); Общедоступная фабрика на полутяжелом весе (состояние символа) {// сначала ищите объект из кэша Flyweight Fly = files.get (state); if (fly == null) {// Если объект не существует, создайте новый объект Flyweight Fly = new ConcreteFlyweight (состояние); // Добавить этот новый объект в полусреднем весе в cache files.put (atation, fly); } return Fly; }}Клиентский класс
Public Class Client {public static void main (string [] args) {// todo Автопогенерированный метод заглушка Flayween-Factory = new FlyweightFactory (); Flyweight Fly = factory.factory (новый персонаж ('a')); Fly.operation ("первый звонок"); fly = factory.factory (новый символ ('b')); Fly.operation («Второй вызов»); fly = factory.factory (новый символ ('a')); Fly.operation ("третий вызов"); }}Хотя клиент подал заявку на три жертвенных объекта, есть только два фактически созданных жертвенных объектов, что означает обмен. Результаты работы следующие:
Сложный режим удовольствия
В режиме простого удовольствия все объекты удовольствия являются простыми объектами удовольствия, что означает, что они могут быть напрямую. Существует также более сложная ситуация, когда некоторые простые внешние режимы синтеза использования объединяются, чтобы сформировать составной внешний объект. Такие композитные объекты мета-эндовольства не могут быть разделены сами по себе, но их можно разбить на простые объекты мета-эн.
Персонажи, участвующие в составном персонаже Сянгюан, следующие:
Аннотация Роль в полусреднем весе: дает абстрактный интерфейс, чтобы указать методы, которые необходимо реализовать все специфические роли в полусреднем весе.
Роль бетона в весе: реализует интерфейс, указанный в абстрактной роли Сяньгюан. Если есть внутреннее состояние, вы должны нести ответственность за предоставление места для хранения для внутреннего состояния.
Роль CompositeCompositeFlyWeight: объекты, представленные составной дощей, не могут быть обмены, но композитный объект Share может быть разложен в множественных комбинациях объектов, которые являются просто общими объектами. Составная внешняя роль также называется неразделенным внешним объектом.
Роль Flayweew -Factory: эта роль отвечает за создание и управление роли Сянгюан. Эта роль должна гарантировать, что объект удовольствия может быть должным образом разделен системой. Когда объект клиента вызывает Xiangyuan объекта, роль Сяньгюанна заворачивается, будет ли уже есть объект Xiangyuan, который соответствует требованиям в системе. Если это уже существует, роль Сяньгьюанской фабрики должна обеспечить существующий объект Сянгюань; Если в системе нет соответствующего объекта Сяньгьюань, роль Сяньгьюанской фабрики должна создать подходящий объект Сянгюан.
исходный код
Абстрактный класс персонажей
Общедоступный интерфейс, вылетенный {// схематический метод, состояние параметра - это внешняя операция общедоступной void (String State);} Особый класс ролевых ролей
Общедоступный класс ConcreteFly -вес реализует пробег {частный символ Intrinsicstate = null; / *** Конструктор, внутреннее состояние передается как параметр* @param wation*/ public concretefly -вес (состояние символа) {this.intrinsicstate = state; } /** * Внешнее состояние передается в качестве параметра в метод, изменяя поведение метода *, но не изменяет внутреннее состояние объекта. */ @Override public void Operation (String State) {// TODO Автогенерированный метод STUB System.out.println ("Intrinsic state =" + this.intrinsicstate); System.out.println ("внешнее состояние =" + state); }}Композитный внешний объект состоит из чистого внешнего объекта посредством соединения, поэтому он обеспечивает метод управления агрегацией, такой как add (). Поскольку композитный мета -объект имеет разные элементы агрегата, эти совокупные элементы добавляются после создания композитного мета -объекта, это само по себе означает, что состояние композитного мета -объекта будет изменяться, поэтому композитный мета -объект не может быть разделен.
Составная внешняя роль реализует интерфейс, указанный абстрактной внешней ролью, то есть методом операции (). Этот метод имеет параметр, который представляет внешнее состояние составного внешнего объекта. Внешние состояния всех элементов композитного объекта наслаждения равны внешнему состоянию композитного объекта удовольствия; Хотя внутренние состояния простого объекта удовольствия, содержащегося в композитном объекте наслаждения, как правило, не равны, в противном случае не будет использования.
Public Class ConcreteCompositeFlyWeight реализует пробег {Private Map <символ, Flyweight> Files = new HashMap <символ, вылепок> (); / *** Добавить новый простой мета-экономный объект в кластер*/ public void add (клавиша символа, летай на лете) {files.put (key, fly); } / *** Внешнее состояние передается в метод в виде параметра* / @Override public void операция (String State) {Flyweight Fly = null; для (Object O: files.keySet ()) {fly = files.get (o); Fly.operation (состояние); }}} Роль фабрики Сяньгьюанна предоставляет два разных метода, один для предоставления простого объекта Сянгюан, а другой для обеспечения составного объекта Сянгюан.
Public Class FlywailainFactory {Private Map <символ, Flyweight> Files = new HashMap <символ, летящий вес> (); / *** Составной фабричный метод Xiangyuan*/ Public Flightweight Factory (List <carem> compositestate) {conceteCompositeFlyweight CompositeFly = new ConcreteCompositeFlyweight (); для (состояние символа: compositestate) {compositeFly.Add (состояние, это. Factory (состояние)); } return CompositeFly; } /*** Простой фабричный метод энциклопедии* /public Flyweight Factory (состояние символа) {// Сначала ищите объект из кэша Flywewewewever Fly = files.get (state); if (fly == null) {// Если объект не существует, создайте новый объект Flyweight Fly = new ConcreteFlyweight (состояние); // Добавить этот новый объект в полусреднем весе в cache files.put (atation, fly); } return Fly; }} Клиентские роли
Public Class Client {public static void main (string [] args) {list <carment> compositeState = new ArrayList <marlect> (); compositestate.add ('a'); compositestate.add ('b'); compositestate.add ('c'); compositestate.add ('a'); compositestate.add ('b'); Flyweenfactory FlyFactory = new FlyweightFactory (); Включенный вес CompositeFly1 = FlyFactory.Factory (CompositEState); Влевой вес CompositeFly2 = FlyFactory.Factory (CompoSitestate); CompositeFly1.operation («Композитный вызов»); System.out.println("--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- FlyFactory.Factory (состояние);Результаты работы следующие:
Из результатов операции можно видеть, что внешнее состояние всех элементов композитного объекта удовольствия равна внешнему состоянию композитного объекта удовольствия. То есть внешнее состояние удачи равна композитному вызову.
Из результатов работы можно увидеть, что состояния коннотации простого существующего объекта, содержащегося в композитном существующем объекте, как правило, неравны. То есть внутренние состояния являются B, C и A.
Из результатов работы можно увидеть, что композитный объект Share не может быть обмен. То есть объект, созданный с использованием одного и того же объекта, композиттата через завод дважды, не тот и тот же объект.
Из результатов операции можно видеть, что простое наслаждение элементом может быть разделено. То есть объект, созданный через завод, дважды, используя одно и то же состояние объекта, является одним и тем же объектом.
Плюсы и минусы модели Сяньгьюань
Преимущество режима энциклопедии заключается в том, что он значительно уменьшает количество объектов в памяти. Тем не менее, цена, которую она платит за это, также очень высока:
Режим энциклопедии делает систему более сложной. Для того чтобы объекты были разделены, необходимо внешнее состояние, что усложняет логику программы.
Режим наслаждения экстернатизирует состояние объекта наслаждения, в то время как чтение внешнего состояния делает время выполнения немного дольше.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.