Factory - определяет какой-то суперкласс, который внутри позволяет порождать объекты разных классов, что удобно для переиспользования в огромных приложениях
Singleton - обеспечивает нам создание единственного класса и его инстанса на всё приложение, откуда бы мы к нему не обращались, что удобно для переиспользования данных внутри или переиспользования всего инстанса
Prototype - предлагает делать нам клонирование одного объекта в другой без вдавания во внутреннюю реализацию
Builder - говорит нам создавать сложные объекты поэтапно
101 Factory Method
В первую очередь - это универсальный паттерн, который позволяет разделять логику тех же выходных данных без перелапачивания всей системы
Пример: мы страховая компания, которая принимает определённые данные про пользователя и должны в определённом виде отдать эти данные определённым образом в API нашей компании. И тут перед нами встаёт задача реализовать передачу данных не только одной нашей страховой компании, но и другой организации, которая имеет другой формат получения данных
Правильная реализация фабрики выглядит следующим образом:
Мы создаём общий интерфейс, который хранит в себе интерфейс самой страховки. И создаём фабрику, которая хранит в себе логику под каждый вид отдаваемых данных
И вот представление реализации фабрики:
Либо мы можем сделать такую реализацию (немного не ООП):
Тут мы в класс createInsurance передаём один из ключей, которые представляют из себя типы страховок. Получая этот тип страховки по ключу, мы возвращаем этот тип и определяем его реализацию
Хоть тут и гораздо более компактное представление фабрики, однако тут мы теряем возможность дописывать отдельно функциональность для каждого типа страховок
102 Singleton
У нас есть одно хранилище и от него нам нужно создать только один инстанс класса - и не давать создавать другие.
По итогу мы имеем сервисы, которые представляют из себя шину для работы с данными, которые находятся внутри хранилища данных
103 Prototype
Данный паттерн эксплуатирует возможности JS, а именно его прототипирование.
Используется, когда нам нужно склонировать объект и все его данные, изменив внутри только небольшую часть данных
То есть обеспечением клонирования объекта занимается какой-то один метод clone()
Вот пример, где мы создали копию одного и того же пользователя, но с разными почтами
104 Builder
Паттерн билдера часто используется, например, в контрактах, когда нам нужно передать от пользователя параметры на изображение (тип фото, высота, ширина) и получить от системы фотографию в нужном формате.
Основным отличием метода билдера является то, что он чейнебл - его можно вызвать много раз друг за другом. То есть объект вызывает метод build и возвращает изменённого себя
И вот пример билдера, который всегда подгоняет данные под нужную структуру объекта. Это даёт нам возможность создать объект, который мы можем спокойно передавать через АПИ.
Когда использовать паттерн?
Всегда, когда нам нужно создать сложный объект и не задумываться над его обязательными свойствами (чтобы, например, передать его через АПИ на бэк или фронт)