← Назад к вопросам

Что такое фабрика в Angular?

2.2 Middle🔥 72 комментариев
#JavaScript Core

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое Фабрика (Factory) в Angular?

В контексте Angular, термин "Фабрика" (Factory) обычно относится к старому механизму создания зависимостей в AngularJS (Angular 1.x). В современном Angular (2+), прямое понятие "фабрики" в классическом виде отсутствует, но его функциональность реализуется через механизмы Dependency Injection (DI), провайдеры (Providers) и фабричные функции (factory functions). Давайте подробнее разберем оба аспекта.

Фабрики в AngularJS (Angular 1.x)

В AngularJS, фабрика была одним из пяти типов "сервисов" (наряду с service, provider, value, constant). Это функция, которая возвращает объект или значение, используемое другими компонентами через DI. Пример:

angular.module('myApp')
  .factory('userFactory', function() {
    var users = [];
    return {
      addUser: function(user) {
        users.push(user);
      },
      getUsers: function() {
        return users;
      }
    };
  });

Здесь userFactory создает экземпляр объекта с методами addUser и getUsers. Этот объект становится синглтоном, инжектируемым в контроллеры и другие сервисы.

Фабрики в современном Angular (Angular 2+)

В современном Angular понятие "фабрики" эволюционировало. Вместо явного объявления фабрики используется провайдер (Provider) с фабричной функцией в useFactory. Это часть системы DI, где фабрика отвечает за создание экземпляра зависимости. Ключевые моменты:

  • Провайдеры определяют, как создаются и внедряются зависимости. Типы провайдеров: useClass, useValue, useExisting и useFactory.
  • Фабричная функция (useFactory) — это функция, которая возвращает экземпляр зависимости, позволяя выполнить сложную логику создания.

Пример фабричной функции в Angular:

import { Injectable, InjectionToken, Inject } from '@angular/core';

// Создаем токен для конфигурации
export const API_CONFIG = new InjectionToken<string>('api.config');

// Сервис, зависящий от конфигурации
@Injectable({
  providedIn: 'root'
})
export class ApiService {
  constructor(@Inject(API_CONFIG) private apiUrl: string) {}

  fetchData() {
    console.log('Fetching from:', this.apiUrl);
  }
}

// Фабричная функция для создания значения API_CONFIG
export function apiConfigFactory() {
  return 'https://api.example.com';
}

// Регистрация с useFactory в модуле
@NgModule({
  providers: [
    {
      provide: API_CONFIG,
      useFactory: apiConfigFactory
    }
  ]
})
export class AppModule { }

Здесь apiConfigFactory создает строку конфигурации, которая инжектируется в ApiService. Фабричная функция может быть более сложной, например, с условиями или асинхронными операциями.

Зачем использовать фабрики?

  1. Динамическое создание зависимостей: Например, создание объекта на основе условий среды (dev/prod).
  2. Интеграция с внешними библиотеками: Если зависимость требует сложной инициализации.
  3. Кэширование и синглтоны: Фабрика может управлять жизненным циклом экземпляра, возвращая один и тот же объект.
  4. Конфигурация: Передача параметров через зависимости, как в примере выше.

Пример с параметрами:

// Фабрика с зависимостями, принимающая параметры
export function loggerFactory(prefix: string) {
  return new LoggerService(prefix);
}

// Регистрация с deps для внедрения зависимостей
providers: [
  {
    provide: LoggerService,
    useFactory: loggerFactory,
    deps: [ 'APP_PREFIX' ] // Зависимости для фабрики
  },
  {
    provide: 'APP_PREFIX',
    useValue: 'MyApp'
  }
]

Отличия от других провайдеров

  • useFactory vs useClass: useClass создает экземпляр класса с new, в то время как useFactory позволяет использовать произвольную функцию для создания объекта.
  • useFactory vs useValue: useValue предоставляет готовое значение, а useFactory вычисляет его в момент инжекции.

Практическое применение

Фабрики полезны в сценариях:

  • Конфигурация API-клиентов: Создание HTTP-клиента с разными настройками для разных сред.
  • Логирование: Инициализация логгера с уровнем логирования из конфигурации.
  • Асинхронные зависимости: Например, если нужно дождаться загрузки конфигурации перед созданием сервиса (хотя для асинхронности часто используют APP_INITIALIZER).

Заключение

В современном Angular, "фабрика" — это не отдельная сущность, а механизм в рамках системы DI, реализуемый через useFactory в провайдерах. Она предоставляет гибкость для создания зависимостей с произвольной логикой. В то время как в AngularJS фабрики были одним из основных способов создания сервисов, в Angular 2+ они эволюционировали в более мощный и типобезопасный инструмент, интегрированный в общую архитектуру. Использование фабричных функций рекомендуется при необходимости сложной логики создания экземпляров, что делает код модульным и тестируемым.

Что такое фабрика в Angular? | PrepBro