Шаблон проектування або патерн (Design pattern) в розробці програмного забезпечення – повторювана архітектурна конструкція, що представляє собою рішення проблеми проектування в рамках деякого часто виникаємого контексту.
Вікіпедія, як завжди, дуже складно все пояснює. Спробуємо перефразувати. Шаблон проектування – це рішення проблем які часто зустрічаються в розробці ПЗ. Патерни проектування не є готовими рішеннями, які можна трансформувати безпосередньо в код, а представляють загальний опис вирішення проблеми, яке можна використовувати в різних ситуаціях.
Існує 3 типи патернів проектування, кожен з яких призначений для вирішення свого кола завдань:
- Породжуючі патерни (Creational), призначені для створення нових об’єктів в системі.
- Структурні патерни (Structural), вирішують завдання компонування системи на основі класів і об’єктів.
- Патерни поведінки (Behavioral), призначені для розподілу обов’язків між об’єктами в системі.
Розглянемо коротко що входить в кожну групу.
Породжуючі патерни
5 шаблонів:
- Абстрактна Фабрика (Abstract Factory) – надає простий інтерфейс для створення об’єктів, які належать до того чи іншого сімейства;
- Будівельник (Builder) – вимальовує стандартний процес створення складного об’єкта, відділяючи логіку будування об’єкта від його представлення;
- Фабричний Метод (Factory Method) – вирішує, яку реалізацію інстанціювати. Вирішують або нащадки Фабричного Методу, або він сам, приймаючи якийсь параметр;
- Прототип (Prototype) – дозволяє нам створювати копії об’єктів, що уже визначені на стадії дизайну (наприклад, список можливих типів зустрічей) або ж визначаються під час виконання програми («п’ятнична вечірка»), таким чином, відпадає необхідність заповнювати всі елементи об’єкту від А до Я. Уже створені або визначені екземпляри об’єкту називаються прототипічними екземплярами (prototypical instances).;
- Одинак (Singleton) – забезпечує існування єдиного екземпляру класу та єдиного доступу до нього.
Структурні патерни
7 шаблонів:
- Адаптер (Adapter) – надає можливість користуватися об’єктом, який не є прийнятним у нашій системі і який не можна змінити. Ми адаптуємо його функціональність через інший, відомий нашій системі, інтерфейс;
- Міст (Bridge) – дозволяє розділити імплементацію від її абстракції, таким чином реалізація може бути змінена окремо від абстракції, оскільки вона не наслідується від неї напряму;
- Компонувальник (Composite) – дозволяє нам зберігати деревовидну структуру і працювати однаково із батьками та дітьми в дереві;
- Декоратор (Decorator) – використовується для надання деякої додаткової функціональності нашим об’єктам;
- Фасад (Facade) – надає єдину «точку доступу» до підсистеми, тим самим спрощуючи її використання та розуміння;
- Легковаговик (Flyweight) – забезпечує підтримку великої кількості об’єктів шляхом виокремлення спільної інформації для збереження в одному екземплярі;
- Проксі (Proxy) – підміняє реальний об’єкт та надсилає запити до нього тоді, коли це потрібно. Проксі також може ініціалізувати реальний об’єкт, якщо він до того не існував.
Патерни поведінки
11 шаблонів:
- Ланцюжок Відповідальностей (Chain of Responsibility) – забезпечує обробку об’єкта шляхом передачі його по ланцюжку доти, доки не буде здійснена обробка якоюсь із ланок;
- Команда (Command) – дозволяє інкапсулювати всю інформацію, необхідну для виконання певних операцій, які можуть бути виконані пізніше, використавши об’єкт команди;
- Інтерпретер (Interpreter) – дозволяє описати граматику певної мови, за допомогою чого можна записати речення на цій мові та інтерпретувати його значення;
- Ітератор (Iterator) – дозволяє доступатися почергово до елементів будь-якої колекції без вникання в суть її імплементації;
- Медіатор (Mediator) – централізує взаємодію між компонентами, таким чином послаблюючи їхню зв’язність;
- Хранитель (Memento) – використовується тоді, коли ви хочете скасовувати операції без відображення внутрішньої структури Хазяїна (Originator). Координація операцій здійснюється Опікуном (Caretaker), який надає можливість простого збереження миттєвих станів системи без уявлення про те, чим ці стани є;
- Спостерігач (Observer) – дозволяє автоматично реагувати багатьом об’єктам на зміну стану певного іншого об’єкта;
- Стан (State) – дозволяє винести логіку визначення стану об’єкту та його поведінку, характерну для цього стану, в інші класи;
- Стратегія (Strategy) – зберігає сім’ю алгоритмів і дозволяє змінювати їх незалежно та переключатися між ними;
- Шаблонний Метод (Template Method) – задає покроковий алгоритм, а елементи алгоритму можуть бути довизначені в похідних класах;
- Відвідувач (Visitor) – дозволяє відділити певний алгоритм від елементів, на яких алгоритм має бути виконаний, таким чином дозволяючи легко додати або ж змінити алгоритм без зміни елементів системи.
Здається що їх забагато, але це ще навіть не усі. Та це навіть не усі в цих групах. Сюди ще можна додати:
Породжуючі: Lazy initialization, Multiton, Object pool, Resource acquisition is initialization (RAII);
Структурні: Front controller;
Поведінкові: Null Object, Servant, Specification, Simple Policy, Single-serving visitor, Hierarchical visitor.
Ну, в загальному, скільки проблем – стільки і шаблонів їх вирішення.
Такс, прочитавши цей список патернів, виникає запитання: “А де ж MVC, MVVM патерни?” На них ж там AngularJS і React написані. А ці шаблони відносяться до Шаблонів архітектури системи. Їх ми розглянемо пізніше.
Ще є крутий шаблон Модуль (Module), який вроді як і до цих відноситься, а вроді як і ні. Модуль можна розглядати як Породжуючий і Структурний патерн. Він керую створенням і організацією інших елементів і групує їх як це робить Структурний патерн. Тут не все просто, але цей варіант ми ще розглянемо чуть пізніше і в трохи іншій статті.
Почитати
https://sites.google.com/site/designpatternseasy/download
https://habrahabr.ru/post/210288/