Режим Xiangyuan отличается от общего режима дизайна. В основном он используется для оптимизации производительности программы. Лучше всего решить проблемы с производительностью, вызванные большим количеством подобных объектов. Схема энциклопедии уменьшает количество объектов и, таким образом, улучшает производительность приложения, анализируя объекты приложения и анализируя их во внутренние и внешние данные.
Базовые знания
Режим энциклопедии уменьшает количество объектов, разделяя большое количество мелкозернистых объектов, тем самым уменьшая память объектов и улучшая производительность приложений. Основная идея состоит в том, чтобы разложить состав существующих аналогичных объектов и расширить их на общие внутренние данные и не общепринятые внешние данные. Мы называем объект внутренних данных мета -объектом. Обычно для поддержания внутренних данных также необходим фабричный класс.
В JS режим энциклопедии в основном состоит из следующих персонажей:
(1) Клиент: класс, используемый для вызова на фабрике Сяньгюан, для получения внутренних данных, обычно объект, требуемый приложением.
(2) Фабрика Сяньгьюан: класс, используемый для хранения данных Сяньгюана
(3) Наслаждайтесь классом Юаня: класс, который поддерживает внутренние данные
Реализация и применение режима Xiangyuan
Общая реализация
Давайте приведем пример для иллюстрации: Apple Mass-Produces Iphone. Большинство данных, таких как модели и экраны, одинаковы, и несколько частей данных, таких как память, делятся на 16G, 32G и т. Д. Перед использованием режима энциклопедии мы записываем код следующим образом:
Функция iPhone (модель, экран, память, sn) {это. модель = модель; this.screen = экран; this.memory = память; this.sn = sn;} var телефоны = []; для (var i = 0; i <1000000; i ++) {var memory = i % 2 == 0? 16: 32; Phones.push (новый iPhone ("iPhone6s", 5.0, память, i));}В этом коде создается миллион iPhone, и каждый iPhone применяется на одну память независимо. Но когда мы присмотримся, мы видим, что большинство айфонов похожи, за исключением того, что память и серийные номера разные. Если это программа с высокопроизводительными требованиями, мы должны рассмотреть возможность ее оптимизации.
Для большого количества программ с аналогичными объектами мы можем рассмотреть возможность использования режима Xiangyuan для его оптимизации. Мы анализируем, что большинство моделей, экранов и памяти iPhone одинаковы, поэтому эта часть данных может использоваться для публичных целей, которые являются внутренними данными в режиме Xiangyuan. Определение класса Xiangyuan заключается в следующем:
Функция iPhoneflyweight (модель, экран, память) {this.model = model; this.screen = экран; this.memory = memory;}Мы определяем класс для iPhone, который содержит три данные: модель, экран и память. Нам также нужна фабрика Xiangyuan для поддержания этих данных:
var flyweewailfactory = (function () {var iphone = {}; return {get: function (модель, экран, память) {var key = model + screen + memory; if (! iPhone [key]) {iPhone [key] = new iPhoneFly -Weewele (модель, экран, память);} return iPhone [key];}};};) ();) (););На этой фабрике мы определяем словарь для спасения жертвенного объекта, предоставляем метод для получения жертвенного объекта в соответствии с параметрами, и если будет жертва, он будет возвращен непосредственно, и если не будет жертвы, он будет создан.
Далее мы создаем клиентский класс, который изменен из класса iPhone:
Функция iPhone (модель, экран, память, sn) {this.flyweight = flyweewuessfactory.get (модель, экран, память); this.sn = sn;}Тогда мы все еще генерируем несколько iPhone, как между
var телефонов = []; для (var i = 0; i <100000000; i ++) {var memory = i % 2 == 0? 16: 32; phones.push (новый iPhone ("iPhone6s", 5.0, память, i));} console.log (телефоны);Ключ здесь - это. Этот код получает данные Xiangyuan через фабрику Xiangyuan. На фабрике Xiangyuan, если объект с теми же данными уже существует, он напрямую вернет объект. Несколько объектов iPhone совместно используют эту часть одних и тех же данных, поэтому исходные аналогичные данные значительно уменьшены, снижая использование памяти.
Применение наслаждения режимом юаня в DOM
Типичным применением режима Xiangyuan является операция события DOM, а механизм событий DOM делится на пузырьки событий и захват событий. Давайте кратко представим эти два:
Пузырь событий: связанное событие начинается с внутреннего элемента, а затем пузырится до самого внешнего слоя
Захват событий: связанное событие начинается с самого внешнего элемента, а затем переходит к внутреннему слою.
Предположим, у нас есть список меню в HTML
<ul> <li> Вариант 1 </li> <li> Опция 2 </li> <li> Опция 3 </li> <li> Опция 4 </li> <li> Опция 5 </li> <li> Опция 6 </li> </ul>
Нажмите на элемент меню, чтобы выполнить соответствующую операцию. Мы связываем события через jQuery, который обычно делает:
$ (". item"). On ("click", function () {console.log ($ (this) .text ());})Свяжите события для каждого элемента списка и нажмите, чтобы вывести соответствующий текст. В настоящее время нет проблем, но если это очень длинный список, особенно если это мобильный телефон с особенно длинным списком, будут проблемы с производительностью, потому что каждый элемент связан с событиями и воспринимает память. Но эти обработчики событий на самом деле очень похожи, поэтому нам нужно оптимизировать их.
$ (". Menu"). On ("click", ".item", function () {console.log ($ (this) .text ());})Таким образом, количество обработчиков событий может быть уменьшено. Этот метод называется делегацией событий, которая также использует принцип модели Сяньгьюань. Обработчик событий является общей внутренней частью, и текст каждого элемента меню является внешней частью. Давайте кратко поговорим о принципе делегирования событий: нажмите на пункт меню, и событие будет пузыриться от элемента LI до элемента UL. Когда мы связываем событие с UL, мы на самом деле связываем событие, а затем используем цель в событии параметров события, чтобы определить, какой элемент щелчок. Например, первый элемент LI на низком уровне, Event.Target - это LI. Таким образом, мы можем получить конкретный элемент клика, и мы можем обращаться по -разному в соответствии с различными элементами.
Суммировать
Режим энциклопедии является средством оптимизации производительности программы и сокращения количества объектов, обменивая публичные данные для достижения программ оптимизации. Режим энциклопедии подходит для сценариев, где существует большое количество аналогичных объектов и требований к производительности. Поскольку режим Xiangyuan должен разделять внутренние и внешние данные, он увеличивает логическую сложность программы, рекомендуется использовать режим Xiangyuan только при требованиях к производительности.
Преимущества наслаждения моделью юаней:
Соответствие ресурсам веб -страниц может быть уменьшено на заказы величины. Даже если применение режима Xiangyuan не может уменьшить количество экземпляров до одного, вы все равно можете извлечь из него большую пользу.
Эта сохранение не требует большой модификации исходного кода. После создания менеджера, завода и Xiangyuan модификации кода являются не чем иным, как изменением непосредственного создания целевого класса к вызову метода объекта менеджера.
Недостатки наслаждаются режимом юаня:
Если он используется в ненужных местах, результат фактически повредит эффективности работы кода. Этот шаблон оптимизирует код, а также увеличивает его сложность, что может вызвать трудности в отладке и обслуживании.
Это препятствует отладке, потому что теперь есть три возможные ошибки: менеджер, завод и Xiangyuan.
Эта оптимизация также может усложнять техническое обслуживание. Теперь вы не сталкиваетесь не с четкой архитектурой, состоящей из объектов, инкапсулирующих данные, а кучу грязных вещей. Данные в нем сохраняются как минимум в двух местах. Лучше всего прокомментировать внутренние данные и внешние данные.
Эта оптимизация должна быть сделана только при необходимости. Должен быть проведен компромисс между оперативной эффективностью и обслуживаемостью. Если вы не уверены, нужно ли вам использовать режим энциклопедии, то, скорее всего, вам это не нужно. Режим Сяньгюань подходит для таких случаев, как системные ресурсы, использовались почти и, очевидно, необходима какая -то оптимизация.
Этот шаблон особенно полезен для программистов JavaScript, потому что его можно использовать для уменьшения количества элементов DOM, которые будут использоваться на веб -странице, зная, что эти элементы потребляют много памяти. Использование этого шаблона и организационного типа, такого как комбинированные шаблоны, могут разработать богатые функциональные системы веб-приложений, которые могут плавно работать в любой современной среде JavaScript.
Применимые случаи для режима Xiangyuan:
Большое количество ресурсных объектов должно использоваться на веб-странице. Если используются только несколько из этих объектов, этот вид оптимизации не является экономически эффективным.
По крайней мере, часть данных, хранящихся в объекте, может быть преобразована во внешние данные. Кроме того, хранение этих данных за пределами объекта должно принимать относительно мало ресурсов, в противном случае этот подход на самом деле является бессмысленным для подсказок на производительность. Тип объекта, который содержит большое количество базового кода и контента HTML, может быть более подходящим для такого рода оптимизации.
После разделения внешних данных количество уникальных объектов относительно мало.