> В чем разница фабрики и билдера (iOS, Swift)

Уровень: senior · Роль: mobile · Категория: Технические вопросы

Компании: Bip.ru

Стек: iOS, Swift

> Пример ответа

Короткий ответ

Фабрика и билдер - оба порождающие паттерны, но решают разные задачи. Фабрика инкапсулирует логику создания объекта в одном месте, часто выбирая конкретный тип из семейства по входным параметрам. Билдер пошагово конструирует сложный объект, контролируя процесс и позволяя опускать необязательные части. Фабрика возвращает готовый объект целиком, билдер - собирает его через цепочку вызовов и лишь в конце вызывает build(). В iOS фабрика типична для создания view-контроллеров, билдер - для сложных конфигураций URLRequest или кастомных вью.

Подробное объяснение

Фабрика - это метод или отдельный тип, который централизует создание объектов. Она скрывает от вызывающего кода детали инициализации и позволяет подменять реализацию без изменения клиента. В Swift часто реализуется как static-метод или отдельный enum/struct с методом make(). Фабрика уместна, когда есть несколько вариантов одного типа (например, разные типы кнопок) или когда создание требует сложной логики (зависимости, настройка окружения).

Билдер - это отдельный объект, который накапливает параметры через методы-сеттеры и в конце создаёт целевой объект. Он решает проблему "телескопических" инициализаторов и позволяет делать объект неизменяемым после сборки. В Swift билдер часто используется с флюент-интерфейсом: builder.setTitle("x").setColor(.red).build(). Ключевое отличие - билдер хранит промежуточное состояние, а фабрика - нет.

Главное различие в уровне абстракции: фабрика отвечает на вопрос "какой объект создать", билдер - "как сконструировать конкретный объект". Фабрика обычно возвращает протокольный тип, билдер - конкретный тип. Фабрика может использовать билдер внутри себя, но не наоборот.

На практике

В iOS-разработке фабрика чаще всего применяется для создания view-контроллеров и координаторов. Например, MainScreenFactory.make() -> MainViewController - это скрывает зависимости и упрощает тестирование. Билдер - для конфигурации сетевых запросов, кастомных UIView с множеством опций, или для создания сложных моделей с валидацией.

Билдер особенно полезен, когда объект имеет много необязательных параметров или когда процесс создания должен быть поэтапным с проверками на каждом шаге. Фабрика лучше, когда выбор конкретной реализации зависит от внешних условий (feature flag, тип пользователя, конфигурация).

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

Пример кода

SWIFT
// Фабрика
enum ViewControllerFactory {
static func makeProfileViewController(userID: String) -> UIViewController {
let service = ProfileService(userID: userID)
let viewModel = ProfileViewModel(service: service)
return ProfileViewController(viewModel: viewModel)
}
}
// Билдер
final class URLRequestBuilder {
private var url: URL?
private var method: HTTPMethod = .get
private var headers: [String: String] = [:]
private var body: Data?
func setURL(_ url: URL) -> Self {
self.url = url
return self
}
func setMethod(_ method: HTTPMethod) -> Self {
self.method = method
return self
}
func addHeader(_ key: String, value: String) -> Self {
headers[key] = value
return self
}
func setBody(_ data: Data) -> Self {
body = data
return self
}
func build() throws -> URLRequest {
guard let url else { throw BuilderError.missingURL }
var request = URLRequest(url: url)
request.httpMethod = method.rawValue
request.allHTTPHeaderFields = headers
request.httpBody = body
return request
}
}

Как отвечать на собеседовании

Начните с чёткого разграничения: фабрика - это про выбор типа, билдер - про пошаговую сборку. Приведите пример из реального iOS-проекта: фабрика для создания экранов, билдер для конфигурации запросов. Подчеркните, что фабрика возвращает готовый объект, а билдер требует явного вызова build(). Упомяните, что билдер решает проблему множества параметров инициализатора, а фабрика - проблему разветвлённой логики создания.

Хорошо показать понимание trade-off: фабрика проще, но менее гибкая при большом числе параметров; билдер гибче, но добавляет лишний слой и требует больше кода. Если спросят про Swift-специфику, отметьте, что в Swift можно использовать @resultBuilder для декларативного синтаксиса, но классический билдер с флюент-интерфейсом остаётся стандартом.

Что проверяет интервьюер

Интервьюер оценивает: понимаете ли вы разницу между порождающими паттернами, умеете ли выбирать подходящий под задачу, видите ли ограничения каждого. Также проверяется знание Swift-идиом: static-методы для фабрик, флюент-цепочки для билдеров. Важно показать, что вы не просто заучили определения, а понимаете, когда какой паттерн применить в реальном iOS-проекте.

Дополнительно проверяется умение рассуждать о дизайне: почему билдер лучше фабрики для объекта с 10 параметрами, почему фабрика удобнее для создания зависимостей. Если кандидат упоминает @resultBuilder или Builder из SwiftUI - это плюс, но не обязательно.

Типичные ошибки

  • Путаница: называют фабрикой любой метод, который возвращает объект - это неверно, фабрика должна инкапсулировать выбор или сложную логику.
  • Говорят, что билдер - это просто сеттеры с возвратом self, забывая про финальный build() и валидацию.
  • Не упоминают, что фабрика часто возвращает протокольный тип, а билдер - конкретный.
  • Приводят примеры только из теории, без привязки к iOS (например, пицца или машина - лучше про UIViewController или URLRequest).
  • Утверждают, что один паттерн лучше другого - на самом деле они решают разные задачи и часто комбинируются.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью