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

Что такое Factory Builder?

2.0 Middle🔥 161 комментариев
#Архитектура и паттерны

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

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

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

Что такое Factory Builder?

Factory Builder — это гибридный порождающий паттерн проектирования, сочетающий в себе концепции Factory Method и Builder. Он решает задачу создания сложных объектов с вариативной структурой, где необходимо не только инкапсулировать логику создания (как в Factory), но и обеспечить пошаговое конфигурирование объекта с множеством параметров (как в Builder). Этот паттерн особенно полезен в Android-разработке для построения объектов с большим количеством опциональных полей или сложной иерархией.

Основные идеи паттерна

  1. Инкапсуляция создания объектов: Используется фабричный метод для инициализации Builder'а, что скрывает детали реализации от клиентского кода.
  2. Пошаговое конструирование: Builder предоставляет fluent-интерфейс для настройки свойств объекта (например, через цепочку методов setX()).
  3. Гибкость и читаемость: Позволяет создавать объекты с разными конфигурациями, избегая "телескопических конструкторов" (множество перегруженных конструкторов) и повышая читаемость кода.

Пример реализации на Kotlin для Android

Представьте, что мы создаём объект Notification для уведомлений в Android, который имеет множество опциональных полей (заголовок, текст, иконка, звук и т.д.). Вместо использования стандартного NotificationCompat.Builder напрямую, мы можем применить Factory Builder, чтобы добавить дополнительный уровень абстракции (например, для кастомизации или валидации).

// Продукт - уведомление
data class CustomNotification(
    val title: String,
    val message: String,
    val iconResId: Int? = null,
    val soundUri: Uri? = null,
    val isHighPriority: Boolean = false
)

// Builder с методами для конфигурации
class NotificationBuilder {
    private var title: String = ""
    private var message: String = ""
    private var iconResId: Int? = null
    private var soundUri: Uri? = null
    private var isHighPriority: Boolean = false

    fun setTitle(title: String): NotificationBuilder {
        this.title = title
        return this
    }

    fun setMessage(message: String): NotificationBuilder {
        this.message = message
        return this
    }

    fun setIcon(resId: Int): NotificationBuilder {
        this.iconResId = resId
        return this
    }

    fun setSound(uri: Uri): NotificationBuilder {
        this.soundUri = uri
        return this
    }

    fun setHighPriority(highPriority: Boolean): NotificationBuilder {
        this.isHighPriority = highPriority
        return this
    }

    fun build(): CustomNotification {
        require(title.isNotEmpty()) { "Title must not be empty" }
        require(message.isNotEmpty()) { "Message must not be empty" }
        return CustomNotification(title, message, iconResId, soundUri, isHighPriority)
    }
}

// Factory для создания Builder'а с предустановками
object NotificationFactory {
    fun createDefaultBuilder(): NotificationBuilder {
        return NotificationBuilder()
            .setIcon(R.drawable.ic_default_notification)
            .setHighPriority(false)
    }

    fun createUrgentBuilder(): NotificationBuilder {
        return NotificationBuilder()
            .setIcon(R.drawable.ic_urgent_notification)
            .setHighPriority(true)
    }
}

// Использование в клиентском коде
fun showNotification(context: Context) {
    val notification = NotificationFactory.createUrgentBuilder()
        .setTitle("Важное уведомление")
        .setMessage("Не пропустите событие!")
        .setSound(Uri.parse("android.resource://${context.packageName}/raw/alert"))
        .build()
    // Дальнейшая обработка notification...
}

Преимущества Factory Builder в Android-разработке

  • Упрощение тестирования: Изолирует логику создания объектов, что упрощает мокирование и тестирование.
  • Соблюдение принципа единственной ответственности: Отделяет конструирование объекта от его бизнес-логики.
  • Поддержка иммутабельности: Позволяет создавать immutable-объекты (например, через data class в Kotlin), что важно для многопоточности.
  • Улучшение читаемости кода: Fluent-интерфейс делает код интуитивно понятным, особенно при работе с библиотеками (например, Retrofit.Builder(), Glide.with()).

Когда использовать паттерн?

  • Объект имеет множество опциональных параметров (более 4-5).
  • Требуются различные предустановленные конфигурации (например, "стандартный", "премиум", "тестовый" режимы).
  • Процесс создания объекта сложный или многоэтапный (например, сборка UI-компонента в Android).
  • Необходимо изолировать клиентский код от изменений в конструкторе продукта.

Вывод

Factory Builder — это мощный паттерн для Android-разработки, который сочетает гибкость Builder'а с инкапсуляцией Factory. Он помогает создавать чистый, поддерживаемый код, особенно при работе со сложными объектами, такими как уведомления, диалоги, сетевые запросы или конфигурации экранов. В реальных проектах он часто используется в комбинации с Dependency Injection (например, через Dagger или Hilt) для дальнейшего упрощения управления зависимостями.