Перейти до основного вмісту

Шаблони проектування

Загальні відомості

Шаблони (або патерни) проектування описують типові способи вирішення проблем, що часто зустрічаються при проектуванні програм і програмних систем.

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

Шаблони проектування поділяються як за рівнями застосування, так і за типами, які застосовуються на конкретному рівні застосування.

Архітектурні шаблони

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

Класичні шаблони проектування

Таблиця шаблонів за групами

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

Шаблони класів

Шаблони класів визначають відносини між класами та їх підкласами.

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

Шаблони об'єктів

Шаблони об'єктів визначають відносини між об'єктами.

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

Породжувальні шаблони

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

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

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

    суперфабрика, яка об'єднує окремі, але споріднені/залежні фабрики без вказівки їх конкретних класів..

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

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

  • Прототип (Prototype)

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

  • Одинак (Singleton)

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

  • Текучий інтерфейс (Fluent Interface)

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

Структурні шаблони

  • Адаптер (Adapter), реалізація через клас

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

  • Адаптер (Adapter), реалізація через об'єкт

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

  • Міст (Bridge)

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

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

    компонує об'єкти в деревовидні структури для представлення ієрархій цілих частин. Композит дозволяє клієнтам однаково обробляти окремі об'єкти та композиції об'єктів.

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

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

    Цей шаблон створює клас-декоратор, який обгортає оригінальний клас і додає нові поведінки/операції до об'єкта під час виконання.

  • Фасад (Facade)

    забезпечує спрощений інтерфейс складної системи класів, бібліотек або фреймворків.

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

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

  • Замісник (Proxy)

    Замісник — це об’єкт, який виступає прошарком між клієнтом та реальним сервісним об’єктом. Замісник отримує виклики від клієнта, виконує свою функцію (контроль доступу, кешування, зміна запиту та інше), а потім передає виклик сервісному об’єктові.

Поведінкові шаблони

  • Інтерпретатор Interpreter

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

  • Ланцюжок обов’язків Chain of Responsibility

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

  • Команда Command

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

  • Ітератор Iterator

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

  • Посередник Mediator

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

  • Знімок Memento

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

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

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

  • Стан State

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

    Цей патерн виглядає як динамічна версія патерну "Стратегія".

  • Стратегія Strategy

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

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

  • Відвідувач Visitor

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

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

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

Джерела інформації