Какие знаешь порождающие паттерны проектирования?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Порождающие паттерны проектирования в 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
- Dependency Injection (Dagger/Hilt) активно использует Builder и Factory для создания графа зависимостей
- Room Persistence Library применяет Builder для конфигурации базы данных
- ViewModelProvider.Factory — реализация Factory Method для создания ViewModel
- RecyclerView.Adapter использует Factory Method для создания ViewHolder
- Intent с дополнениями можно рассматривать как вариант Builder
Критерии выбора паттерна
- Singleton: когда нужен единственный экземпляр на всё приложение
- Factory Method: когда класс заранее не знает, объекты каких подклассов ему нужно создавать
- Abstract Factory: когда система должна быть независимой от процесса создания объектов
- Builder: когда объект имеет много опциональных параметров или требует пошагового конструирования
- Prototype: когда создание объекта дороже копирования существующего
Правильное применение порождающих паттернов в Android помогает создавать поддерживаемый, тестируемый и масштабируемый код, особенно важный в контексте частых изменений требований и необходимости поддерживать несколько версий приложения.