Назад к вопросам
Junior
112
questionbank

Какие паттерны проектирования вы знаете?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

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

  • Singleton: Гарантирует существование только одного экземпляра класса и предоставляет глобальную точку доступа к нему.
  • Factory Method: Определяет интерфейс для создания объекта, но позволяет подклассам решать, какой класс инстанцировать.
  • Abstract Factory: Предоставляет интерфейс для создания семейств связанных или зависимых объектов, не специфицируя их конкретные классы.
  • Builder: Разделяет конструирование сложного объекта на шаги, позволяя создавать различные представления объекта с использованием одного и того же процесса конструирования.
  • Prototype: Создает объекты, дублируя существующий экземпляр (прототип), вместо повторного выполнения процесса конструирования.

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

  • Adapter: Преобразует интерфейс одного класса в другой интерфейс, ожидаемый клиентами. Позволяет работать классам с несовместимыми интерфейсами.
  • Bridge: Отделяет абстракцию от ее реализации, позволяя им изменяться независимо.
  • Composite: Компонует объекты в древовидные структуры для представления иерархий «часть-целое». Позволяет клиентам единообразно работать с отдельными объектами и композициями объектов.
  • Decorator: Динамически добавляет новые обязанности к объекту, оборачивая его в специальный объект-декоратор.
  • Facade: Предоставляет унифицированный интерфейс к набору интерфейсов подсистемы. Определяет интерфейс более высокого уровня, который упрощает использование подсистемы.
  • Flyweight: Использует разделяемое состояние между множеством мелких объектов, чтобы уменьшить объем используемой памяти и увеличить производительность.
  • Proxy: Предоставляет заместитель объекта, управляющий доступом к оригинальному объекту.

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

  • Chain of Responsibility: Передает запрос по цепочке обработчиков. Каждый обработчик решает, обработать ли запрос или передать его следующему обработчику в цепочке.
  • Command: Инкапсулирует запрос как объект, позволяя параметризовать клиентов с различными запросами, ставить запросы в очередь или вести их логи.
  • Interpreter: Определяет грамматическое представление для языка и включает интерпретатор для интерпретации предложений в этом языке.
  • Iterator: Предоставляет способ последовательного доступа ко всем элементам составного объекта, не раскрывая его внутреннего представления.
  • Mediator: Определяет объекты, которые управляют взаимодействием между набором других объектов. Способствует слабой связанности, позволяя объектам взаимодействовать без явного обращения друг к другу.
  • Memento: Предоставляет возможность сохранения и восстановления внутреннего состояния объекта без нарушения инкапсуляции.
  • Observer: Определяет зависимость «один ко многим» между объектами, чтобы при изменении состояния одного объекта все зависимые от него объекты уведомлялись и автоматически обновлялись.
  • State: Позволяет объекту изменять свое поведение в зависимости от своего внутреннего состояния. Каждое состояние инкапсулируется в отдельный класс.
  • Strategy: Определяет семейство алгоритмов, инкапсулирует каждый из них и делает их взаимозаменяемыми. Позволяет выбирать алгоритм во время выполнения.
  • Template Method: Определяет каркас алгоритма в операции, откладывая некоторые шаги до подклассов. Позволяет подклассам определять шаги алгоритма без изменения структуры самого алгоритма.
  • Visitor: Представляет операцию, которая должна быть выполнена над элементами структурой объектов. Позволяет определять новую операцию, не изменяя классы элементов, над которыми она действует.

В iOS-разработке также часто встречаются:

  • Model-View-Controller (MVC): Архитектурный паттерн, разделяющий приложение на три связанных компонента: Модель (данные и бизнес-логика), Представление (интерфейс пользователя) и Контроллер (связь между Моделью и Представлением).
  • Delegate: Паттерн, позволяющий одному объекту действовать от имени или координировать действия другого объекта.
  • Observer (NotificationCenter): Система рассылки уведомлений, позволяющая объектам получать сообщения без прямой связи друг с другом.
  • Target-Action: Механизм, используемый для отправки сообщений от элементов управления (например, кнопок) к целевому объекту.
  • Coordinator: Паттерн для управления навигационными потоками в приложении, отделяя логику навигации от контроллеров.
  • Dependency Injection: Паттерн, в котором зависимости объекта внедряются извне, а не создаются самим объектом.
// Пример Singleton
class SettingsManager {
    static let shared = SettingsManager() // Single instance

    private init() {
        // Private initializer to prevent external creation
    }

    var appVersion: String {
        return Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "Unknown"
    }
}

// Использование
let settings = SettingsManager.shared
print("App Version: \(settings.appVersion)")
// Пример Delegate (простой)
protocol ButtonDelegate: AnyObject {
    func buttonWasTapped(_ button: UIButton)
}

class MyButton: UIButton {
    weak var delegate: ButtonDelegate? // Delegate property

    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        super.touchesEnded(touches, with: event)
        delegate?.buttonWasTapped(self) // Call delegate method
    }
}

class ViewController: UIViewController, ButtonDelegate {
    override func viewDidLoad() {
        super.viewDidLoad()
        let myButton = MyButton(frame: CGRect(x: 50, y: 50, width: 100, height: 40))
        myButton.setTitle("Tap Me", for: .normal)
        myButton.backgroundColor = .blue
        myButton.delegate = self // Set delegate
        view.addSubview(myButton)
    }

    func buttonWasTapped(_ button: UIButton) {
        print("Button was tapped in ViewController")
    }
}