Что такое шаблон дизайна?

Каждый шаблон описывает проблему, которая возникает снова и снова в нашей среде, а затем описывает суть решения этой проблемы в таких способ, которым вы можете использовать это решение миллион раз, никогда не повторяя его дважды, - Кристофер Александр

Шаблоны проектирования в разработке программного обеспечения популяризировала группа из четырех авторов в своей книге «Шаблоны проектирования».

Шаблон проектирования в компьютерном программном обеспечении может помочь вам выявить проблему и эффективно ее решить, используя эффективный и многократно используемый процесс.

Преимущества использования шаблонов дизайна

Проблема может быть решена разными способами, но шаблон проектирования предоставляет вам эффективный и многоразовый способ решения проблемы. Это поможет вам следующим образом.

  1. Уменьшение избыточности - стандартное решение распространенной проблемы программирования, позволяющее многократно использовать программное обеспечение в больших масштабах.
  2. Скорость. Ускорьте разработку, предоставив проверенные и проверенные парадигмы разработки.
  3. Код, подверженный ошибкам. Повторное использование шаблона проектирования помогает предотвратить малозаметные проблемы, которые могут вызвать серьезные проблемы.
  4. Эффективная практика кодирования - улучшите читаемость кода для программистов и архитекторов, знакомых с шаблонами.

Мы обсудим множество типов шаблонов дизайна, наиболее часто используемых один раз

  1. Основные шаблоны создания - шаблон Singleton, Factory и Builder. Его можно использовать при создании объектов.
  2. Шаблоны управления потоком - его можно использовать для эффективного управления данными и потоком управления.
  3. Шаблоны проектирования модулей. В JavaScript этот шаблон является наиболее часто используемым шаблоном проектирования для того, чтобы отдельные фрагменты кода не зависели от других компонентов. Это обеспечивает слабую связь для поддержки хорошо структурированного кода.
  4. Структурные шаблоны. Этот шаблон помогает определить эффективные и систематические отношения между объектами и сущностями.
  5. Поведенческие шаблоны. Поведенческие шаблоны определяют способы общения между классами и объектами.
  6. Шаблоны обмена сообщениями. Эти шаблоны помогают нам оптимизировать межпроцессный обмен сообщениями и поток данных.

В этой части 1 мы обсудим только основные шаблоны создания

i) Шаблоны проектирования синглтонов

Синглтоны - это объекты, которые могут иметь только один экземпляр с единственной точкой доступа.

  • Они полезны для поддержания центрального состояния, когда все могут выходить за пределы одного и того же состояния.
  • Предположим, у вас есть модуль, который экспортирует две функции, как показано ниже.
let x = 0
module.export ={
 add:(num)=>x+num
 sub:(num)=>x-num
}
  • Когда этот модуль импортируется в несколько файлов или используется несколько раз в приложении, создается только один экземпляр и ссылается на один и тот же экземпляр, поскольку система модулей кэширует модуль в момент обращения к нему с помощью оператора require в самый первый раз. После этого везде упоминается одна и та же система.

Пример синглтона

  1. Сначала мы создали модуль BalanceHandler, который содержит три метода сложения, вычитания и суммирования с частной переменной balance.
  2. Мы дважды импортировали этот модуль в App.js в константе BalanceHandler1 и BalanceHandler2 с использованием инструкции require
  3. Затем мы вызвали метод add из BalanceHandler1 и сложили сумму 20 и 10.
  4. После этого мы вызываем метод add для BalanceHandler2 и добавляем сумму 30.
  5. Теперь, если вы вызовете метод суммы BalanceHandler1, вы получите 60 вместо 30 (20 + 10).
  6. Это связано с тем, что BalanceHandler1 и BalanceHandler2 читают и записывают из одного и того же кэшированного экземпляра.
  7. Ознакомьтесь с приведенным выше кодом здесь

Посмотрим, как мы поступаем с классами.

  • Пример 1 с классами

Давайте посмотрим, что происходит в приведенном выше примере.

  1. у нас есть класс Bank в Bank.js, у которого есть три метода добавить, вычесть и сумма.
  2. У нас есть два файла User1.js и User2.js, которые импортируют банк класс.
  3. В User1.js мы создаем класс User1, который содержит три метода: depositAmount, pullwAmount и getBalance. . Перед классом User1 мы создаем новый экземпляр класса Bank. Что мы используем во всех трех методах.
  4. В User2.js мы делаем то же самое для User2, что и для User1. Здесь мы также создаем новый экземпляр Bank
  5. В App.js мы используем классы User1 и User2 и вызываем метод depositAmount с 50 и 100 соответственно . аналогичным образом, вызывая removewAmount метод с суммами 10 и 20.
  6. Если вы запустите App.js с помощью команды ниже.
  7. Ознакомьтесь с приведенным выше кодом здесь
node App.js

Вы увидите вывод

User one account balance is 40 // user 1 deposit 40 and withdraw 10
User two account balance is 80 // user 2 deposit 100 and withdraw 20

Проблема с примером 1

Хотя наш модуль кэширован, мы создаем два отдельных экземпляра класса Bank в User1.js и еще один в User2.js, это, естественно, не ведет себя как одноэлементный

  • Если в этом примере использовался шаблон синглтона, то баланс для user1 и user2 должен быть одинаковым, поскольку синглтоны - это объекты, которые могут иметь только один экземпляр.

Решение, пример 1

При работе с классами создание экземпляра класса перед его экспортом из модуля приведет к синглтону

  • Если вы посмотрите на снимок выше. Этот код следует шаблонам Singleton.
  • Теперь у нас есть экземпляр строки 15. Bank Class в Bank.js. Это означает, что мы создаем экземпляр только один раз и оба user1 и user2, используя один и тот же экземпляр.
  • Теперь, если вы запустите узел App.js, вы получите следующий результат
  • Ознакомьтесь с приведенным выше кодом здесь
User one account balance is 120 
User one account balance is 120 // (40+100-10-20)
  • Если вы помните, что сначала user1 депозирует 40, затем user2 вносит 100, после этого User1 снимает 10, а user2 снимает 20. Таким образом, в последнем случае у обоих пользователей будет баланс 120, потому что оба читают и записывают из одного и того же кэшированного экземпляра.

Важное примечание

При использовании несовместимых имен файлов в ОС без учета регистра модуль НЕ будет вести себя как синглтон, потому что он будет кэшироваться как отдельные экземпляры

ii) Заводской узор

Этот образец был определен Бандой четырех, которая говорит:

Определите интерфейс для создания объекта, но позвольте подклассам решать, какой класс создать.

  • Этот шаблон также известен как шаблон виртуального конструктора.
  • Заводской шаблон чрезвычайно полезен при написании пакетов NPM для публичного использования.
  • Шаблон фабрики используется для создания объектов без раскрытия логики создания экземпляров. Этот шаблон можно использовать, когда нам нужно создать другой объект в зависимости от определенного условия. Например:

  • Здесь, в vehicleFactory.js, мы определили класс VehicleFactory для создания нового объекта на основе type получено. Кроме того, мы создали класс Truck and Bike, который используется для создания новых объектов грузовика и велосипеда.
  • В App.js мы создали новый объект factory из vehicleFactory класс.
  • Мы создаем новые объекты bike и truck, вызывая factory.createVehicle , передав тип автомобиля и другие конфигурации.
  • В заключение, с помощью этого шаблона мы создаем объект грузовика и велосипеда, не раскрывая логику создания экземпляра.
  • Ознакомьтесь с приведенным выше кодом здесь

Преимущества заводской выкройки

  • Создание динамического объекта. Его можно использовать в том случае, если тип объекта определяется во время выполнения.
  • Абстракция - нет доступа к фактическому конструктору объекта.
  • Возможность многократного использования - одни и те же фабрики можно использовать для аналогичных объектов, так же как вы можете создать грузовик с 2 шинами или 4 шинами на одном и том же заводе.

iii) Шаблон Строителя

Согласно "Бандам четырех"

Отделите построение сложного объекта от его представления, чтобы один и тот же процесс построения мог создавать разные представления.

Шаблон Builder позволяет клиенту создать сложный объект, указав только тип и содержимое. Детали конструкции полностью скрыты от клиента.

Давайте посмотрим на пример

  1. Сначала мы создаем функцию-конструктор Pizza, которая имеет свойство pizza как пустой объект и несколько методов, таких как s etBase, setSauce, setCheese, setToppings и запекать
  2. Консоль метода Bake все объекты пиццы
  3. В App.js мы импортируем функцию Pizza и создаем экземпляр margherita из Pizza.
  4. Итак, мы создали нашего конструктора пиццы до этого момента.
  5. С помощью margherita теперь мы можем установить основу, соус, сыр и начинки.
  6. Теперь вы можете создавать несколько пицц, настраивая пиццу, например, начинку из сыра и т. Д.
  7. Ознакомьтесь с приведенным выше кодом здесь

Шаблон Factory vs Builder

Давайте еще раз сравним эти два изображения бок о бок в последний раз, но на этот раз сосредоточив внимание на различиях.

  • Абстрактная фабрика: выделяет семейство объектов продукта (простых или сложных).
  • Builder: ориентирован на пошаговое построение сложного объекта.
  • Абстрактная фабрика: сосредоточьтесь на том, что делается
  • Строитель: сосредоточьтесь на том, * как * это сделано
  • Абстрактная фабрика. Сосредоточьтесь на определении множества различных типов * фабрик * для создания множества * продуктов *, а не создание одного продукта для одного продукта.
  • Строитель: сосредоточьтесь на создании одного комплекса, но одного единственного * продукта *
  • Абстрактная фабрика: откладывает выбор конкретного типа объекта до времени выполнения.
  • Builder: скрыть логику / операцию компиляции этого сложного объекта.
  • Абстрактная фабрика: * каждый * вызов метода создает и возвращает разные объекты
  • Builder: только последний вызов метода возвращает объект, тогда как другие вызовы частично создают объект.

Ключевые баллы

  1. В синглтоне объекты могут иметь только один экземпляр с единственной точкой доступа.
  2. Модульная система узла кэширует модули
  3. При работе с классами создание экземпляра класса перед его экспортом из модуля приведет к синглтону
  4. Заводской шаблон предоставляет интерфейс для создания предварительно настроенных объектов.

Репозиторий GitHub для указанного выше кода -



Ссылки

  1. Https://www.packtpub.com/web-development/nodejs-design-patterns-video
  2. Https://blog.bitsrc.io/understanding-design-patterns-in-javascript-13345223f2dd
  3. Https://www.dofactory.com/javascript/builder-design-pattern
  4. Https://sites.google.com/site/sureshdevang/abstract-factory-vs-builder-design-patterns

Разместите свой собственный блог в C2E Blog

Хотите писать для CodeToExpress? Мы будем рады видеть вас техническим писателем. Отправьте нам письмо со ссылкой на ваш черновик на [email protected]