Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
Collapse
exlends
Категории
  1. Home
  2. Categories
  3. Языки программирования
  4. JavaScript
  5. Что такое "фабрика" в программировании? На примере JavaScript

Что такое "фабрика" в программировании? На примере JavaScript

Scheduled Pinned Locked Moved JavaScript
javascript
1 Posts 1 Posters 4 Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • kirilljsxK Online
    kirilljsxK Online
    kirilljsx
    js
    wrote last edited by
    #1

    Фабрика (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), тебе нужно только:
      1. Создать новый класс.
      2. Добавить его в createUser.
    • Всё остальное приложение продолжает работать, используя общий интерфейс (hasAccess, getInfo и т.д.).

    Фабрика — это как “конвейер”, который на вход получает параметры (например, role) и на выходе даёт готовый объект нужного типа.

    Это делает код:

    • гибче,
    • легче для тестирования,
    • проще для расширения.
    1 Reply Last reply
    0

    Категории

    • Главная
    • Новости
    • Фронтенд
    • Бекенд
    • Языки программирования

    Контакты

    • Сотрудничество
    • info@exlends.com
    • Наш чат
    • Наш ТГ канал

    © 2024 - 2025 ExLends, Inc. Все права защищены.

    Политика конфиденциальности
    • Login

    • Don't have an account? Register

    • Login or register to search.
    • First post
      Last post
    0
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups