Технології проектування (Шаблони проектування)

Тема моєї статті сьогодні буде про Design patterns (технологічні шаблони) в програмуванні. Design patterns, або ж шаблони проєктування, це перевірені часом та тестовані рішення для поширених проблем, що виникають під час розробки програмного забезпечення.

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

Чому ми повинні використовувати шаблони проєктування?

Є кілька причин, чому варто використовувати шаблони проєктування:

  • Шаблони дозволяють писати код, який легше зрозуміти, оновлювати і розширювати.
  • Вони пропонують перевірені рішення та найкращі практики.
  • Вивчення шаблонів допомагає швидко і ефективно вирішувати схожі проблеми в різних проєктах.
  • Розробники можуть створювати багаторазові компоненти, які можна використовувати в різних додатках.
  • Це зменшує надлишковість і економить час на розробку.

Шаблони проєктування зазвичай діляться на три основні категорії залежно від їх цілей.

A- Створення (Creational) шаблони проєктування

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

pic

1- Singleton Design Pattern

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

У Spring, Bean'и, визначені за допомогою анотацій @Service, @Component або @Repository, за замовчуванням управляються як Singleton.

2- Factory Design Pattern

Factory Design Pattern делегує процес створення об'єктів фабриці, і клієнт не повинен хвилюватися про те, який саме підклас об'єкта буде створено. Цей шаблон використовується для абстракції процесу створення об'єктів і забезпечення динамічної структури.

Якщо в класі фабрики буде багато перевірок типу, код може стати надто складним (збільшення умов if-else або switch-case). Це може вимагати використання Abstract Factory або більш гнучких методів у майбутньому.

3- Abstract Factory Design Pattern

Цей шаблон надає інтерфейс для створення пов'язаних сімейств об'єктів і не вимагає від клієнта знати, з якого конкретного класу ці об'єкти походять. Це можна розглядати як поєднання кількох фабричних методів.
Приклад: Створення інтерфейсів для різних платформ (Windows, MacOS).

4- Builder Design Pattern

Цей шаблон дозволяє організувати створення складних об'єктів крок за кроком. У цьому шаблоні процес створення об'єкта передається класу Builder, який поступово створює частини об'єкта.

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

5- Prototype Design Pattern

Prototype Design Pattern використовує механізм глибокого або поверхневого копіювання для створення нового екземпляра на основі вже існуючого об'єкта. Це допомагає знизити витрати на створення об'єктів та зменшити залежність від класів. Це особливо корисно в випадках, коли створення об'єктів є дорогим.
Приклад: Коли створення об'єкта є дорогим процесом (наприклад, створення великих даних у додатку).

B- Структурні (Structural) шаблони проєктування

Структурний шаблон проєктування стосується складу класів та об'єктів або того, як об'єкти та класи об'єднуються в більші структури.

pic

1- Шаблон Адаптера (Adapter Pattern)

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

2- Шаблон Моста (Bridge Pattern)

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

3- Шаблон Композит (Composite Pattern)

Дозволяє обробляти групу об'єктів так само, як і один об'єкт.
Приклад: Файлова система з файлами та папками.

4- Шаблон Декоратора (Decorator Pattern)

Використовується для динамічної зміни поведінки об'єкта без створення підкласів.
Приклад: Додавання додаткових інгредієнтів до кавового замовлення (молоко, цукор).

5- Шаблон Фасаду (Facade Pattern)

Забезпечує спрощений інтерфейс для управління складною системою.
Приклад: Спрощений інтерфейс для операції переказу коштів в банківській системі.

6- Шаблон Летючого Ваги (Flyweight Pattern)

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

7- Шаблон Проксі (Proxy Pattern)

Описує, як замінити об'єкт іншим для керування доступом, зниження вартості і складності.
Приклад: Проксі, який забезпечує контроль доступу до файлу.

C- Поведінкові (Behavioral) шаблони проєктування

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

pic

1- Шаблон Спостерігача (Observer Pattern)

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

2- Шаблон Стратегії (Strategy Pattern)

Спрощує вибір між різними алгоритмами та дозволяє змінювати алгоритм динамічно.
Приклад: Різні алгоритми сортування.

3- Шаблон Стану (State Pattern)

Дозволяє об'єкту змінювати свою поведінку в залежності від його стану.
Приклад: Робота банкомату з різними станами (зняття коштів, перегляд балансу).

4- Шаблон Команди (Command Pattern)

Упаковує запити в об'єкти, дозволяючи ставити їх у чергу або скасовувати.
Приклад: Функція "відміни" в текстовому редакторі.

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

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

6- Шаблон Метод-шаблон (Template Method Pattern)

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

7- Шаблон Інтерпретатора (Interpreter Pattern)

Цей шаблон визначає граматику мови та дозволяє оцінювати вирази цієї мови. Метою є визначення синтаксису маленької мови або виразу і застосування логіки для їх оцінки.
Приклад: Простий інтерпретатор математичних виразів (наприклад, для виразів типу 4 + 5 * 3).

8- Шаблон Візитера (Visitor Pattern)

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

9- Шаблон Посередника (Mediator Pattern)

Замість прямої комунікації між об'єктами, шаблон посередника дозволяє здійснювати комунікацію через посередника.
Приклад: Системи керування польотами.

10- Шаблон Мементо (Memento Pattern)

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

Нижче ви можете знайти приклади застосування всіх шаблонів проєктування на моєму GitHub акаунті:

[

GitHub - miracciftci/Design-Patterns

Внесіть свій вклад у розвиток miracciftci/Design-Patterns, створивши акаунт на GitHub.

github.com

](https://github.com/miracciftci/Design-Patterns?source=post_page-----45788cfe48b6--------------------------------)

Перекладено з: Design Patterns (Tasarım Kalıpları)

Leave a Reply

Your email address will not be published. Required fields are marked *