Найти тему
Фронтенд

Основные паттерны проектирования в JavaScript. Паттерн «Фабрика».

Оглавление

Благодаря заложенным в паттерн принципам объектно-ориентированного и функционального программирования, «Фабрика» является одним из самых популярных паттернов проектирования.

Паттерн используется:

  • Когда нужно определять типы и зависимости библиотеки по ходу её написания
  • Когда нужно дать сторонним разработчикам возможность безболезненно расширять функционал библиотеки
  • Когда нужно экономить системные ресурсы. Фабричный паттерн позволяет использовать уже созданные объекты, вместо создания новых

Принцип создания:

Прежде чем создать класс-фабрику нам нужно определить все возможные типы и вариации создаваемых классов.

На основе этих типов мы создаем некий общий интерфейс внутри класса-фабрики, в котором нужные классы будут создаваться не напрямую через оператор «new», а через некий API в виде методов.

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

Пример кода:

В нашем случае мы создадим фабрику пользователей. Она, при помощи метода «create», будет создавать пользователей разных типов с разными правами доступа:

Класс фабрики пользователей — «UserFactory»
Класс фабрики пользователей — «UserFactory»

После создания класса-фабрики создадим сами типы классов пользователей, у нас их два — «User» и «Admin»:

Типы  классов — «User» и «Admin»
Типы классов — «User» и «Admin»

Мы унаследовали класс «Admin» от класса «User». Теперь когда мы захотим расширить функционал класса «User» — например, добавить метод устанавливающий пароль, этот функционал появиться и у класса «Admin».

Для удобства поместим наш класс-фабрику «UserFactory» в переменную «factory», и уже через неё вызовем метод «create», который вернет в переменную «newUser» вновь созданного пользователя:

Пример кода: https://jsfiddle.net/DevExp/wn8kh5bj/
Пример кода: https://jsfiddle.net/DevExp/wn8kh5bj/

Итог

Таким образом мы создали один общий интерфейс для создания похожих между собой классов. Структура интерфейса соответствует основным принципам объектно ориентированного программирования, легко поддерживается и масштабируется.

Задание

Для закрепления материала, попробуйте добавить новый тип пользователя — например, «Editor» с правами «edit» и методом отправки статьей «sendArticle». Затем для всех пользователей нужно создать метод устанавливающий пароль для учетной записи «setPassword».

Ошибки?

Если вы обнаружили ошибку в тексте статьи или вам есть что добавить, пожалуйста напишите об этом в комментариях. Спасибо!

А в каких ситуациях данный паттерн использовали вы?