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

Какие знаешь порождающие паттерны проектирования?

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

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

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

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

Порождающие паттерны проектирования в Android-разработке

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

1. Singleton (Одиночка)

Назначение: Гарантирует существование только одного экземпляра класса и предоставляет глобальную точку доступа к нему. Использование в Android: Логгеры, менеджеры подключений к БД (Room, Realm), Retrofit-клиенты, shared preferences.

class NetworkClient private constructor() {
    companion object {
        @Volatile
        private var instance: NetworkClient? = null
        
        fun getInstance(): NetworkClient {
            return instance ?: synchronized(this) {
                instance ?: NetworkClient().also { instance = it }
            }
        }
    }
    
    fun makeRequest() { /* ... */ }
}
// Использование
val client = NetworkClient.getInstance()

2. Factory Method (Фабричный метод)

Назначение: Определяет интерфейс для создания объекта, но позволяет подклассам изменять тип создаваемого экземпляра. Использование в Android: Создание фрагментов с аргументами, генерация ViewHolder в RecyclerView.Adapter.

interface Dialog {
    fun show()
}

class InfoDialog : Dialog {
    override fun show() { /* ... */ }
}

class ErrorDialog : Dialog {
    override fun show() { /* ... */ }
}

abstract class DialogFactory {
    abstract fun createDialog(): Dialog
    
    companion object {
        inline fun <reified T : Dialog> createFactory(): DialogFactory {
            return when (T::class) {
                InfoDialog::class -> InfoDialogFactory()
                ErrorDialog::class -> ErrorDialogFactory()
                else -> throw IllegalArgumentException()
            }
        }
    }
}

class InfoDialogFactory : DialogFactory() {
    override fun createDialog() = InfoDialog()
}

3. Abstract Factory (Абстрактная фабрика)

Назначение: Предоставляет интерфейс для создания семейств связанных объектов без указания их конкретных классов. Использование в Android: Создание UI-компонентов для разных тем (светлая/тёмная), кроссплатформенные фабрики.

interface UIComponent {
    fun render()
}

class MaterialButton : UIComponent {
    override fun render() { /* ... */ }
}

class CupertinoButton : UIComponent {
    override fun render() { /* ... */ }
}

interface UIFactory {
    fun createButton(): UIComponent
    fun createTextField(): UIComponent
}

class MaterialFactory : UIFactory {
    override fun createButton() = MaterialButton()
    override fun createTextField() = MaterialTextField()
}

4. Builder (Строитель)

Назначение: Позволяет создавать сложные объекты пошагово, отделяя конструирование от представления. Использование в Android: AlertDialog.Builder в Android SDK, создание сложных объектов данных (DTO), Room Database Builder.

data class User(
    val name: String,
    val age: Int,
    val email: String? = null,
    val phone: String? = null
) {
    class Builder {
        private var name: String = ""
        private var age: Int = 0
        private var email: String? = null
        private var phone: String? = null
        
        fun setName(name: String) = apply { this.name = name }
        fun setAge(age: Int) = apply { this.age = age }
        fun setEmail(email: String) = apply { this.email = email }
        fun setPhone(phone: String) = apply { this.phone = phone }
        
        fun build() = User(name, age, email, phone)
    }
}
// Использование
val user = User.Builder()
    .setName("Иван")
    .setAge(30)
    .setEmail("ivan@example.com")
    .build()

5. Prototype (Прототип)

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

interface Clonable<T> {
    fun clone(): T
}

data class AppConfig(
    val theme: String,
    val language: String,
    val notificationsEnabled: Boolean
) : Clonable<AppConfig> {
    override fun clone(): AppConfig {
        return copy() // Используем data class copy
    }
}

// Использование
val originalConfig = AppConfig("dark", "ru", true)
val clonedConfig = originalConfig.clone()

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

  1. Dependency Injection (Dagger/Hilt) активно использует Builder и Factory для создания графа зависимостей
  2. Room Persistence Library применяет Builder для конфигурации базы данных
  3. ViewModelProvider.Factory — реализация Factory Method для создания ViewModel
  4. RecyclerView.Adapter использует Factory Method для создания ViewHolder
  5. Intent с дополнениями можно рассматривать как вариант Builder

Критерии выбора паттерна

  • Singleton: когда нужен единственный экземпляр на всё приложение
  • Factory Method: когда класс заранее не знает, объекты каких подклассов ему нужно создавать
  • Abstract Factory: когда система должна быть независимой от процесса создания объектов
  • Builder: когда объект имеет много опциональных параметров или требует пошагового конструирования
  • Prototype: когда создание объекта дороже копирования существующего

Правильное применение порождающих паттернов в Android помогает создавать поддерживаемый, тестируемый и масштабируемый код, особенно важный в контексте частых изменений требований и необходимости поддерживать несколько версий приложения.