Дисклеймер

Інформація на сайті tseivo.com є суб'єктивною та відображає особисті погляди та досвід авторів та авторок блогів.

Використовуйте цей ресурс як одне з декількох джерел інформації під час своїх досліджень та прийняття рішень. Завжди застосовуйте критичне мислення. Людина сама несе відповідальність за свої рішення та дії.

Що таке патерн проєктування в програмуванні?

Патерн проєктування в програмуванні - це загальне рішення для типових проблем, які виникають при розробці програмного забезпечення. Це архітектурний підхід, який надає стандартизований спосіб розв'язування конкретних проблем або задач у програмуванні.
Патерни проєктування допомагають розробникам створювати програмне забезпечення, яке є гнучким, легко розширюваним та легко підтримується. Вони вирішують конкретні проблеми без необхідності створення нових рішень з нуля. Використання патернів проєктування допомагає полегшити розуміння та утримання коду, сприяє використанню найкращих практик (best practice) та покращує здатність команди до співпраці.
Патерни проєктування можна класифікувати за три основні категорії.

Породжувальні (Creational) патерни 

Спрощують процес створення об'єктів. До цієї категорії входять, наприклад, Singleton, Factory Method, Abstract Factory.

Структурні (Structural) патерни

Спрощують організацію структур програми та взаємодію між компонентами. До них відносяться, наприклад, Adapter, Composite, Proxy.

Поведінкові (Behavioral) патерни

Описують способи організації взаємодії між об'єктами. Сюди входять, наприклад, Observer, Strategy, Command.
Застосування патернів проєктування сприяє розширенню та підтримці коду, а також полегшує комунікацію між членами команди розробників. Коли розробник стикається з типовою проблемою, він може застосувати відповідний патерн проєктування, що робить його код більш структурованим та підтримуваним.
Існує багато патернів проєктування які підходять для вирішення різних задач. Гарна практика - аналізувати задачу або проблему та вирішувати який патерн підійде краще в цьому конкретному випадку. Також не варто забувати про best practice. Нижче розглянемо найпопулярніші патерни та сфери застосування. Для більш глибокого розуміння треба вивчати кожен патерн окремо. Ця нотатка дає лише дуже стислий огляд (кілька речень).

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

Визначає інтерфейс для створення об'єктів, але залишає вибір підкласам, якій клас створити.
Класичний приклад - створення графічних елементів (кнопок, полів вводу) у графічних інтерфейсах.

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

Надає інтерфейс для створення сімейств взаємодіючих або залежних об'єктів без їхніх конкретних класів.
Приклад - cтворення графічних елементів (кнопок, полів вводу, вікон) з певним стилем або темою.

Будівельник (Builder)

Розділяє процес побудови складного об'єкта від його представлення, щоб один і той же процес побудови міг створювати різні представлення.
Приклад  - створення об'єктів зі складними конфігураціями, такими як об'єкт-автомобіль із різними опціями.

Прототип (Prototype)

Дозволяє створювати нові об'єкти шляхом копіювання існуючих об'єктів, забезпечуючи гнучкість і швидкість створення об'єктів.
Приклад - створення копій документів, графічних об'єктів тощо.

Сінглтон або Одинак (Singleton)

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

Адаптер (Adapter)

Дозволяє інтерфейсу працювати з іншим несумісним інтерфейсом.
Приклад - адаптація інтерфейсів різних бібліотек чи класів для їх зручної взаємодії.

Міст (Bridge)

Розділяє абстракцію від реалізації, дозволяючи їм змінюватися незалежно один від одного.
Приклад - розділення графічного інтерфейсу від його реалізації, щоб мати можливість змінювати обидві частини незалежно.

Компонувальник (Composite)

Об'єднує групу об'єктів в деревоподібну структуру для роботи з ними так, ніби це єдиний об'єкт.
Приклад - побудова дерева ієрархії файлової системи.

Декоратор (Decorator)

Дозволяє динамічно додавати новий функціонал об'єктам.
Приклад - розширення функціоналу об'єкта, наприклад, додавання декораторів до графічних об'єктів.

Фасад (Facade)

Надає простий і уніфікований інтерфейс до великої групи інтерфейсів у підсистемі.
Приклад - створення фасаду для складних бібліотек або підсистем для зручного використання.

Легковаговик (Flyweight)

Дозволяє об'єктам ділитися спільними частинами для економії пам'яті.
Приклад - створення легковагових об'єктів для ефективного використання ресурсів.

Замісник (Proxy)

Дозволяє використовувати спеціальні об'єкти-замінники замість реальних. Ці об'єкти перехоплюють виклики, що адресовані оригінальному об'єкту, що дозволяє вставляти власний код перед або після передачі виклику оригінальному об'єкту.
Приклад - використання проксі-об'єкта для контролю доступу до важкого об'єкта, такого як велике зображення.

Ланцюг відповідальності (Chain of Responsibility)

Дозволяє передавати запити об'єктам-обробникам, утворюючи ланцюг.
Приклад - обробка запитів на різних рівнях системи, доки запит не буде оброблений.

Команда (Command)

Інкапсулює запит як об'єкт, дозволяючи параметризувати клієнта запитами, об'єктами та чергами.
Приклад - реалізація черги запитів.

Ітератор (Iterator)

Надає спосіб послідовного доступу до об'єктів без викриття їхньої внутрішньої структури.
Приклад - перебір елементів списку чи колекції без розкриття їхнього внутрішнього устрою.

Посередник (Mediator)

Визначає об'єкт, який інкапсулює спосіб взаємодії набору об'єктів.
Приклад - створення медіатора (посередника) для керування взаємодією великої кількості компонентів графічного інтерфейсу.

Знімок (Memento)

Забезпечує можливість зберігання та відновлення попереднього стану об'єкта.
Приклад - збереження стану гри, щоб гравець міг повертатися до попередніх точок.

Спостерігач (Observer)

Визначає залежність одного або багатьох об'єктів від стану іншого об'єкта.
Приклад - реалізація підписки на оновлення в графічних інтерфейсах чи системах оповіщення.

Стан (State)

Дозволяє об'єкту змінювати свою поведінку, коли його стан змінюється.
Приклад - реалізація скріпта зі станами для керування поведінкою об'єкта в залежності від умов. Наприклад поведінка NPC в залежності від його стану та оточеня. 

Стратегія (Strategy)

Визначає сімейство алгоритмів, і робить їх взаємозамінними.
Приклад -вибір алгоритму сортування у залежності від потреби в конкретному випадку.

Шаблонний метод (Template Method)

Визначає загальну структуру алгоритму, дозволяючи підкласам змінювати деякі кроки алгоритму.
Приклад - реалізація шаблону для створення подібних алгоритмів.

Відвідувач (Visitor)

Дозволяє визначити нову операцію, не змінюючи класи об'єктів там де вона використовується.
Приклад - реалізація відвідувача для обробки різних типів об'єктів у складній системі.

Згруповані патерни за основними категоріями

Породжувальні (Creational) патерни:
  • Фабричний метод (Factory Method)
  • Абстрактна фабрика (Abstract Factory)
  • Будівельник (Builder)
  • Прототип (Prototype)
  • Сінглтон або Одинак (Singleton)
Структурні (Structural) патерни:
  • Адаптер (Adapter)
  • Міст (Bridge)
  • Компонувальник (Composite)
  • Декоратор (Decorator)
  • Фасад (Facade)
  • Легковаговик (Flyweight)
  • Замісник (Proxy)
Поведінкові (Behavioral) патерни:
  • Ланцюг відповідальності (Chain of Responsibility)
  • Команда (Command)
  • Ітератор (Iterator)
  • Посередник (Mediator)
  • Знімок (Memento)
  • Спостерігач (Observer)
  • Стан (State)
  • Стратегія (Strategy)
  • Шаблонний метод (Template Method)
  • Відвідувач (Visitor)
📝 Більше публікацій: