Перейти к содержанию
  • Лента
  • Категории
  • Последние
  • Метки
  • Популярные
  • Пользователи
  • Группы
Свернуть
exlends
Категории
  1. Главная
  2. Категории
  3. Языки программирования
  4. JavaScript
  5. Что такое "фабрика" в программировании? На примере JavaScript

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

Запланировано Прикреплена Закрыта Перенесена JavaScript
javascript
10 Сообщения 5 Постеры 87 Просмотры
  • Сначала старые
  • Сначала новые
  • По количеству голосов
Ответить
  • Ответить, создав новую тему
Авторизуйтесь, чтобы ответить
Эта тема была удалена. Только пользователи с правом управления темами могут её видеть.
  • kirilljsxK Не в сети
    kirilljsxK Не в сети
    kirilljsx
    js
    написал в отредактировано
    #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 ответ Последний ответ
    0
    • Алекс44А Не в сети
      Алекс44А Не в сети
      Алекс44
      написал в отредактировано
      #2

      А если нужно добавить новую роль, например, ‘editor’, не придется ли переписывать всю фабрику? Мне кажется, switch-конструкция не очень масштабируема.

      1 ответ Последний ответ
      0
      • В Не в сети
        В Не в сети
        Ванек
        написал в отредактировано
        #3

        Думаю, что можно заменить switch на объект-маппинг: const roles = { admin: Admin, moderator: Moderator } и потом вызывать new rolesrole. Так добавление новой роли будет в одну строку.

        1 ответ Последний ответ
        0
        • ВасилийВ Не в сети
          ВасилийВ Не в сети
          Василий
          написал в отредактировано
          #4

          А как быть с зависимостями? Допустим, для создания Admin нужен дополнительный параметр — уровень доступа. Не усложнит ли это фабрику?

          1 ответ Последний ответ
          0
          • WowkW Не в сети
            WowkW Не в сети
            Wowk
            написал в отредактировано
            #5

            фабрика как раз для того и нужна, чтобы инкапсулировать сложную логику создания. Можно передавать объект с опциями: createUser({ name: ‘Alex’, role: ‘admin’, accessLevel: 3 }).

            1 ответ Последний ответ
            0
            • Алекс44А Не в сети
              Алекс44А Не в сети
              Алекс44
              написал в отредактировано
              #6

              Не нарушает ли фабрика принципы SOLID? Вроде как должна быть открытость для расширения, но закрытость для изменений.

              1 ответ Последний ответ
              0
              • В Не в сети
                В Не в сети
                Ванек
                написал в отредактировано
                #7

                Если использовать маппинг через объект и не нарушает. Добавляешь новый класс и регистрируешь его в маппинге без изменения кода фабрики. Или можно вообще использовать внедрение зависимостей.

                1 ответ Последний ответ
                0
                • ВасилийВ Не в сети
                  ВасилийВ Не в сети
                  Василий
                  написал в отредактировано
                  #8

                  А я не могу понять, а как тестировать такие фабрики? Мокировать же все классы при unit-тестах? Будет результат? Что скажете?

                  1 ответ Последний ответ
                  0
                  • WowkW Не в сети
                    WowkW Не в сети
                    Wowk
                    написал в отредактировано
                    #9

                    Достаточно тестировать, что фабрика возвращает корректный тип объекта для разных входных параметров. А методы самих классов тестируются отдельно.

                    1 ответ Последний ответ
                    0
                    • Алекс44А Не в сети
                      Алекс44А Не в сети
                      Алекс44
                      написал в отредактировано
                      #10

                      Теперь вижу, что фабрика действительно упрощает жизнь, особенно когда классов много. Попробую переделать свой модуль аутентификации по этому принципу.

                      1 ответ Последний ответ
                      0

                      Категории

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

                      Контакты

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

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

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

                      • Нет учётной записи? Зарегистрироваться

                      • Войдите или зарегистрируйтесь для поиска.
                      • Первое сообщение
                        Последнее сообщение
                      0
                      • Лента
                      • Категории
                      • Последние
                      • Метки
                      • Популярные
                      • Пользователи
                      • Группы