> В чем разница фабрики и билдера (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 = .getprivate var headers: [String: String] = [:]private var body: Data?func setURL(_ url: URL) -> Self {self.url = urlreturn self}func setMethod(_ method: HTTPMethod) -> Self {self.method = methodreturn self}func addHeader(_ key: String, value: String) -> Self {headers[key] = valuereturn self}func setBody(_ data: Data) -> Self {body = datareturn self}func build() throws -> URLRequest {guard let url else { throw BuilderError.missingURL }var request = URLRequest(url: url)request.httpMethod = method.rawValuerequest.allHTTPHeaderFields = headersrequest.httpBody = bodyreturn request}}
Как отвечать на собеседовании
Начните с чёткого разграничения: фабрика - это про выбор типа, билдер - про пошаговую сборку. Приведите пример из реального iOS-проекта: фабрика для создания экранов, билдер для конфигурации запросов. Подчеркните, что фабрика возвращает готовый объект, а билдер требует явного вызова build(). Упомяните, что билдер решает проблему множества параметров инициализатора, а фабрика - проблему разветвлённой логики создания.
Хорошо показать понимание trade-off: фабрика проще, но менее гибкая при большом числе параметров; билдер гибче, но добавляет лишний слой и требует больше кода. Если спросят про Swift-специфику, отметьте, что в Swift можно использовать @resultBuilder для декларативного синтаксиса, но классический билдер с флюент-интерфейсом остаётся стандартом.
Что проверяет интервьюер
Интервьюер оценивает: понимаете ли вы разницу между порождающими паттернами, умеете ли выбирать подходящий под задачу, видите ли ограничения каждого. Также проверяется знание Swift-идиом: static-методы для фабрик, флюент-цепочки для билдеров. Важно показать, что вы не просто заучили определения, а понимаете, когда какой паттерн применить в реальном iOS-проекте.
Дополнительно проверяется умение рассуждать о дизайне: почему билдер лучше фабрики для объекта с 10 параметрами, почему фабрика удобнее для создания зависимостей. Если кандидат упоминает @resultBuilder или Builder из SwiftUI - это плюс, но не обязательно.
Типичные ошибки
- Путаница: называют фабрикой любой метод, который возвращает объект - это неверно, фабрика должна инкапсулировать выбор или сложную логику.
- Говорят, что билдер - это просто сеттеры с возвратом
self, забывая про финальныйbuild()и валидацию. - Не упоминают, что фабрика часто возвращает протокольный тип, а билдер - конкретный.
- Приводят примеры только из теории, без привязки к iOS (например, пицца или машина - лучше про
UIViewControllerилиURLRequest). - Утверждают, что один паттерн лучше другого - на самом деле они решают разные задачи и часто комбинируются.
> Похожие задачи по mobile
В чем разница паттернов Bridge и Proxy
Как решить проблему тестирования синглтона с использованием моков
Как организовать сетевые вызовы в iOS проекте
Может ли дедлок возникать между задачами на разных очередях
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью