Что такое "фабрика" в программировании? На примере JavaScript
JavaScript
1
Posts
1
Posters
4
Views
-
Фабрика (Factory) — это паттерн проектирования, который позволяет создавать объекты без указания конкретного класса или типа. Вместо прямого вызова
new SomeClass()
, ты используешь функцию (или объект), которая решает, какой именно объект создать, в зависимости от входных данных.Преимущества:
- Упрощает расширение кода.
- Скрывает сложность создания объектов.
- Централизует логику создания.
Пример: Фабрика на JavaScript
Допустим, у нас есть разные типы пользователей: админ, модератор, обычный пользователь. У каждого разные права.
Мы можем создать фабрику, которая будет возвращать нужный объект в зависимости от роли.
// Базовый класс пользователя class User { constructor(name, role) { this.name = name; this.role = role; } getInfo() { return `${this.name} — ${this.role}`; } hasAccess() { return false; } } // Конкретные типы пользователей class Admin extends User { constructor(name) { super(name, 'admin'); } hasAccess() { return true; // Админ имеет доступ ко всему } deleteAccount(userId) { console.log(`Админ ${this.name} удалил аккаунт ${userId}`); } } class Moderator extends User { constructor(name) { super(name, 'moderator'); } hasAccess() { return true; } banUser(userId) { console.log(`Модератор ${this.name} забанил пользователя ${userId}`); } } class RegularUser extends User { constructor(name) { super(name, 'user'); } hasAccess() { return false; } } // 🏭 Фабрика пользователей function createUser(name, role) { switch (role) { case 'admin': return new Admin(name); case 'moderator': return new Moderator(name); case 'user': return new RegularUser(name); default: throw new Error(`Неизвестная роль: ${role}`); } } // 🔧 Использование фабрики const admin = createUser("Алексей", "admin"); const mod = createUser("Мария", "moderator"); const user = createUser("Иван", "user"); console.log(admin.getInfo()); // Алексей — admin console.log(mod.getInfo()); // Мария — moderator console.log(user.getInfo()); // Иван — user console.log(admin.hasAccess()); // true console.log(user.hasAccess()); // false admin.deleteAccount(123); // Алексей удалил аккаунт 123 mod.banUser(456); // Мария забанила пользователя 456
Почему это удобно?
- Если ты захочешь добавить новый тип пользователя (например,
guest
), тебе нужно только:- Создать новый класс.
- Добавить его в
createUser
.
- Всё остальное приложение продолжает работать, используя общий интерфейс (
hasAccess
,getInfo
и т.д.).
Фабрика — это как “конвейер”, который на вход получает параметры (например,
role
) и на выходе даёт готовый объект нужного типа.Это делает код:
- гибче,
- легче для тестирования,
- проще для расширения.
© 2024 - 2025 ExLends, Inc. Все права защищены.