Реалізація окремих шаблонів проектування на мові C++: абстрактна фабрика(abstractfactory), одинак (singleton), адаптер (adapter).

Можливості застосування шаблонів проектування STL.

Класифікація шаблонів проектування STL (creational, structural, behavior, concurrencypatterns).

Шаблони проектування (designpatterns).

Зміст лекції

Огляд стандартної бібліотеки шаблонів

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

Стандартна бібліотека шаблонів STL [14-21, 30] - частина стандартної бібліотеки C++ SCL, що забезпечує загальноцільові стандартні класи й функції, які реалізують найбільш популярні й широко використовувані алгоритми й структури даних.

Бібліотека STL розроблена співробітником Hewllet - Packard Олександром Степановим. STL будується на основі шаблонів класів, і тому вхідні в неї алгоритми й структури застосовні майже до всіх типів даних. Ядро бібліотеки утворюють три складові: контейнери, алгоритми й ітератори.

Шаблони проектування програмного забезпечення(англ. software design patterns) - ефективні способи вирішення завдань проектування програмного забезпечення. Шаблон не є закінченим зразком, який можна безпосередньо транслювати в програмний код.

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

 

 

Уявімо, що ви прийшли в іграшковий магазин (відіграючи роль діда Мороза ) і хочете накупити іграшок дітям (і не обов'язково своїм). Мартуся любити плюшеві іграшки, вона часто із ними лягає у ліжко спати. А Дмитрик страшний розбишака, ламає усе на світі, рові м' які іграшки і, зазвичай, віддає перевагу гратися із твердими, дерев'яними іграшками. Двоє дітей хочуть ведмедика і котика і ще купу інших тваринок. На щастя, магазин має широкий асортимент забавок і вам вдалося удосталь закупитися. У один мішок ви накидали дерев'яних іграшок, а в інший плюшевих.

Таким чином, коли ви підійшли до Мартусі, яка любити м' які іграшки, ви витягали із свого мішка спочатку плюшевого ведмедя, а далі плюшевого котика і так далі. Аналогічно ви підійшли до Дмитрика і подарували йому дерев'яного ведмедика і котика, і собаку, і слона, і бегетота.. і крокодила..

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

У нашому прикладі сімейством є набір іграшок -тварин, які по- сімейному реалізують базові класи ведмедика (Bear), кота (Cat), і інші. Тобто повний звіринець певної реалізації, дерев' яної або плюшевої, і буде сімейством. Конкретною фабрикою є мішок. Одна із конкретних фабрик повертає дерев' яні іграшки, а інша повертає плюшеві. Тому якщо одна дитина просити котика, то їй повернути реалізацію котика у відповідності до інстанційованого мішка із іграшками.

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

Абстрактна Фабрика є дуже широковикористовуваним дизайн патерном. Дуже яскравим прикладом буде ADO.NET DbProviderFactory, яка є абстракною фабрикою, що визначає інтерфейси для отримання DbCommand, DbConnection, DbParameter і так далі. Конкретна фабрика SqlClientFactory поверне відповідно SqlCommand, SqlConnection і так далі. Що дозволяє працювати із різними джерелами даних. Дякую за ті, що дочитали про цей дизайн патерн саме із моєї книги та із моїм прикладом.

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

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

Клас, зображений нижче, демонструє просту реалізацію дизайн патерну Одинак (ця назва, чесно кажучи, звучить дещо "дико". Думаю, що може буде краще його називати Синглтон. Як вважаєте?)

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

Отже, мі збираємося почати роботові програми із методу DoHardWork і хочемо залогувати факт того, що вона почалася, всякі інші події та факт того, що робота закінчилася.

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