Благодаря заложенным в паттерн принципам объектно-ориентированного и функционального программирования, «Фабрика» является одним из самых популярных паттернов проектирования.
Паттерн используется:
- Когда нужно определять типы и зависимости библиотеки по ходу её написания
- Когда нужно дать сторонним разработчикам возможность безболезненно расширять функционал библиотеки
- Когда нужно экономить системные ресурсы. Фабричный паттерн позволяет использовать уже созданные объекты, вместо создания новых
Принцип создания:
Прежде чем создать класс-фабрику нам нужно определить все возможные типы и вариации создаваемых классов.
На основе этих типов мы создаем некий общий интерфейс внутри класса-фабрики, в котором нужные классы будут создаваться не напрямую через оператор «new», а через некий API в виде методов.
После этого класс-фабрику можно определить в переменную, из которой вызываются нужные методы для создания классов.
Пример кода:
В нашем случае мы создадим фабрику пользователей. Она, при помощи метода «create», будет создавать пользователей разных типов с разными правами доступа:
После создания класса-фабрики создадим сами типы классов пользователей, у нас их два — «User» и «Admin»:
Мы унаследовали класс «Admin» от класса «User». Теперь когда мы захотим расширить функционал класса «User» — например, добавить метод устанавливающий пароль, этот функционал появиться и у класса «Admin».
Для удобства поместим наш класс-фабрику «UserFactory» в переменную «factory», и уже через неё вызовем метод «create», который вернет в переменную «newUser» вновь созданного пользователя:
Итог
Таким образом мы создали один общий интерфейс для создания похожих между собой классов. Структура интерфейса соответствует основным принципам объектно ориентированного программирования, легко поддерживается и масштабируется.
Задание
Для закрепления материала, попробуйте добавить новый тип пользователя — например, «Editor» с правами «edit» и методом отправки статьей «sendArticle». Затем для всех пользователей нужно создать метод устанавливающий пароль для учетной записи «setPassword».
Ошибки?
Если вы обнаружили ошибку в тексте статьи или вам есть что добавить, пожалуйста напишите об этом в комментариях. Спасибо!