Назовите все парттерны, которые вы знаете. Перечислите те, которые вы использовали на практике.ios-60

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

Порождающие :

  1. Singleton - единственный экземпляр класса
  2. Factory Method - создание объектов через специальный метод
  3. Abstract Factory - создание семейств связанных объектов
  4. Builder - пошаговое создание сложных объектов
  5. Prototype - клонирование объектов

Структурные :

  1. Adapter - адаптация интерфейса
  2. Decorator - динамическое добавление обязанностей
  3. Facade - упрощенный интерфейс к сложной системе
  4. Proxy - объект-заместитель
  5. Composite - иерархия "часть-целое"

Поведенческие :

  1. Observer - механизм подписки/уведомлений
  2. Delegate - передача ответственности
  3. Command - инкапсуляция запроса как объекта
  4. Strategy - инкапсуляция алгоритмов
  5. State - изменение поведения при смене состояния

Специфичные iOS паттерны

  1. MVVM (Model-View-ViewModel) - с биндингами данных
  2. Coordinator - управление навигацией
  3. VIPER (View-Interactor-Presenter-Entity-Router)
  4. Dependency Injection - внедрение зависимостей
  5. Repository - абстракция над источником данных

Паттерны, которые я использовал на практике

1. MVVM + Combine

class UserViewModel {
    @Published var users: [User] = []
    private var cancellables = Set<AnyCancellable>()

    func fetchUsers() {
        NetworkService.fetchUsers()
            .sink(receiveCompletion: { _ in },
                  receiveValue: { [weak self] in self?.users = $0 })
            .store(in: &cancellables)
    }
}

2. Coordinator

protocol Coordinator {
    var childCoordinators: [Coordinator] { get set }
    func start()
}

class AppCoordinator: Coordinator {
    var childCoordinators = [Coordinator]()
    private let window: UIWindow

    init(window: UIWindow) {
        self.window = window
    }

    func start() {
        let mainCoordinator = MainCoordinator(window: window)
        childCoordinators.append(mainCoordinator)
        mainCoordinator.start()
    }
}

3. Repository

protocol UserRepositoryProtocol {
    func getUsers() -> AnyPublisher<[User], Error>
}

class UserRepository: UserRepositoryProtocol {
    private let remoteDataSource: UserRemoteDataSource
    private let localDataSource: UserLocalDataSource

    init(remote: UserRemoteDataSource, local: UserLocalDataSource) {
        self.remoteDataSource = remote
        self.localDataSource = local
    }

    func getUsers() -> AnyPublisher<[User], Error> {
        return remoteDataSource.fetchUsers()
            .catch { _ in self.localDataSource.fetchUsers() }
            .eraseToAnyPublisher()
    }
}

4. Dependency Injection

class DataService {
    private let networkService: NetworkServiceProtocol
    private let cacheService: CacheServiceProtocol

    init(networkService: NetworkServiceProtocol,
         cacheService: CacheServiceProtocol) {
        self.networkService = networkService
        self.cacheService = cacheService
    }
}

5. Decorator

protocol DataFetcher {
    func fetchData() -> Data
}

class LoggingDataFetcher: DataFetcher {
    private let wrapped: DataFetcher

    init(wrapped: DataFetcher) {
        self.wrapped = wrapped
    }

    func fetchData() -> Data {
        print("Fetching data at \(Date())")
        return wrapped.fetchData()
    }
}

Реальные кейсы применения

  1. Singleton:

    • Логгер (Logger.shared)
    • Менеджер аутентификации (AuthManager.shared)
  2. Factory:

    • Создание разных типов ячеек таблицы
    protocol CellFactory {
        func createCell(for model: ItemModel, tableView: UITableView) -> UITableViewCell
    }
    
  3. Observer:

    • Отслеживание изменений настроек приложения через NotificationCenter
    • Обновление UI при изменении данных (Combine/SwiftUI)
  4. Strategy:

    • Разные алгоритмы кэширования (MemoryCache, DiskCache)
    • Различные стратегии сортировки данных
  5. Adapter:

    • Адаптация API старых сервисов под новые интерфейсы
    • Работа со сторонними SDK

Современные тенденции

  1. Комбинация паттернов:

    • MVVM + Coordinator + Repository
    • VIPER с Dependency Injection
  2. Функциональные подходы:

    • Использование immutable структур
    • Чистые функции вместо некоторых классических паттернов
  3. Реактивное программирование (Combine/RxSwift):

    • Замена классических Observer/Delegate

Резюмируем

Основные паттерны, которые я реально применял в iOS разработке:

  1. Архитектурные:

    • MVVM, Coordinator, VIPER, Clean Architecture
  2. Порождающие:

    • Singleton (ограниченно), Factory, DI, Builder
  3. Структурные:

    • Adapter, Decorator, Facade
  4. Поведенческие:

    • Observer (Combine), Delegate, Strategy, State

Ключевой принцип: паттерны — это инструменты, а не догма. В современных iOS проектах я предпочитаю комбинацию MVVM + Coordinator + Repository с реактивным подходом (Combine), так как это дает хороший баланс между тестируемостью, поддерживаемостью и производительностью разработки.