Что такое паттерны проектирования? Какие паттерны вы знаете?android-6

1. Что такое паттерны проектирования?

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

Основные характеристики:

  • Проверенные временем решения
  • Универсальный язык для разработчиков
  • Улучшают поддерживаемость кода
  • Ускоряют процесс разработки

2. Классификация паттернов

2.1. Порождающие

Решают проблемы создания объектов:

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

    • Гарантирует один экземпляр класса
    • Пример в Android: AppCompatActivity, Application класс
    object DatabaseHelper {
        fun queryData() { ... }
    }
    
  2. Factory (Фабрика)

    • Создание объектов без указания точного класса
    interface View {
        fun draw()
    }
    
    class ViewFactory {
        fun createView(type: String): View {
            return when(type) {
                "button" -> ButtonView()
                else -> TextView()
            }
        }
    }
    
  3. Builder (Строитель)

    • Пошаговое создание сложных объектов
    • Пример: AlertDialog.Builder в Android
    val dialog = AlertDialog.Builder(context)
        .setTitle("Title")
        .setMessage("Message")
        .create()
    

2.2. Структурные

Организация классов и объектов:

  1. Adapter (Адаптер)

    • Преобразует интерфейс класса в другой интерфейс
    • Пример: RecyclerView.Adapter в Android
    class UserAdapter(private val users: List<User>) :
        RecyclerView.Adapter<UserAdapter.ViewHolder>() {
        // Реализация адаптера
    }
    
  2. Decorator (Декоратор)

    • Динамическое добавление новой функциональности
    • Пример: ContextWrapper в Android
    val decoratedContext = ContextThemeWrapper(baseContext, R.style.AppTheme)
    
  3. Facade (Фасад)

    • Упрощённый интерфейс к сложной системе
    • Пример: Retrofit библиотека
    interface ApiService {
        @GET("users")
        fun getUsers(): Call<List<User>>
    }
    

2.3. Поведенческие

Решают задачи эффективного взаимодействия объектов:

  1. Observer (Наблюдатель)

    • Уведомление об изменениях
    • Пример: LiveData в Android
    liveData.observe(this) { data ->
        // Обновление UI
    }
    
  2. Strategy (Стратегия)

    • Инкапсуляция алгоритмов
    • Пример: Разные алгоритмы сортировки
    interface SortStrategy {
        fun sort(items: List<Int>): List<Int>
    }
    
    class BubbleSort : SortStrategy { ... }
    class QuickSort : SortStrategy { ... }
    
  3. Command (Команда)

    • Инкапсуляция запроса как объекта
    • Пример: Runnable в Android
    val command = Runnable {
        // Выполнение действия
    }
    handler.post(command)
    

3. Android-специфичные паттерны

  1. MVVM (Model-View-ViewModel)

    • Современный паттерн для Android
    • Разделение ответственности
    // ViewModel
    class UserViewModel : ViewModel() {
        val users: LiveData<List<User>> = repository.getUsers()
    }
    
    // Activity/Fragment (View)
    viewModel.users.observe(viewLifecycleOwner) { users ->
        adapter.submitList(users)
    }
    
  2. Repository

    • Единый источник данных
    class UserRepository(
        private val localDataSource: UserLocalDataSource,
        private val remoteDataSource: UserRemoteDataSource
    ) {
        fun getUsers(): LiveData<List<User>> {
            // Логика получения данных
        }
    }
    
  3. Dependency Injection (Внедрение зависимостей)

    • Пример: Hilt/Dagger
    @Module
    @InstallIn(SingletonComponent::class)
    object AppModule {
        @Provides
        fun provideRepository(): UserRepository {
            return UserRepositoryImpl()
        }
    }
    

4. Антипаттерны в Android

  1. God Activity - Activity/Fragment, который делает слишком много
  2. Spaghetti Code - отсутствие чёткой структуры
  3. Boat Anchor - неиспользуемый код, который сохраняется "на всякий случай"

Резюмируем

  1. Паттерны - это проверенные решения типовых проблем.
  2. Основные категории:
    • Порождающие (создание объектов)
    • Структурные (организация кода)
    • Поведенческие (взаимодействие объектов)
  3. В Android особенно популярны:
    • MVVM
    • Repository
    • Dependency Injection
  4. Использование паттернов делает код:
    • Чище
    • Поддерживаемее
    • Легче для тестирования

Совет: На собеседовании лучше подробно рассказать о 2-3 паттернах, которые вы реально применяли в проектах, с конкретными примерами.