Особливості породжуючих паттернів. Порівняння паттернів Abstract Factory, Factory Method та Prototype
Зміст
- 1. Особливості породжуючих паттернів
- 2. Реалізація задачі паттернами Prototype, Factory Method та Abstract Factory. Порівняння паттернів з допомогою діаграм класів
- Споріднені теми
Пошук на інших ресурсах:
1. Особливості породжуючих паттернів
У випадку, якщо система створює об’єкти різних класів, то існує два способи параметризувати цю систему класами створюваних об’єктів.
- З класу, який створює об’єкти, породити підкласи. Кожен з підкласів безпосередньо створює відповідний конкретний об’єкт. Цей спосіб відповідає паттерну Factory Method (Фабричний метод). Недоліком цього паттерну є необхідність створення нового підкласу тільки для того, щоб змінити клас продукту. Якщо таких змін багато, то це породжує значну множину підкласів.
- Реалізувати композицію об’єктів. При цьому підході визначається об’єкт, який містить інформацію про класи об’єктів, які повинні бути продуктами. Потім цей об’єкт робиться параметром системи. За цим принципом працюють паттерни Abstract Factory (Абстрактна фабрика), Builder (Будівник) та Prototype (Прототип).
Для всіх трьох вищезгаданих паттернів виникає поняття “фабричного об’єкту”, який призначений для виготовлення продуктів.
У паттерні Abstract Factory “фабричний об’єкт” створює об’єкти різних класів.
При реалізації паттерну Builder, продукт створюється “фабричним об’єктом” відповідно до заданої послідовності (протоколу) кроків.
Для паттерну Prototype характерним є створення продукту шляхом отримання копії з об’єкту-прототипу. Тут фактично “фабричний об’єкт” і є продуктом.
⇑
2. Реалізація задачі паттернами Prototype, Factory Method та Abstract Factory. Порівняння паттернів з допомогою діаграм класів
Нижче наведено реалізацію музичного редактора з допомогою паттернів Prototype, Factory Method, Abstract Factory.
Нехай потрібно побудувати музичний редактор який містить палітру інструментів та допускає додавання нових музичних об’єктів в партитуру. Музичний редактор відображається в графічному редакторі, який представлений абстрактним класом Graphic. Графічними компонентами можуть бути ноти (клас MusicalNote) та нотні стани (клас Staff) а також деякий абстрактний клас (наприклад Tool), який визначає інструменти в палітрі. З цього абстрактного класу може бути визначений підклас GraphicTool для інструментів, які створюють графічні об’єкти та додають їх в документ.
Одне з рішень задачі музичного редактора пропонує паттерн Abstract Method. Рисунок 1 відображає відповідну діаграму класів.
Абстрактний розробник (інтерфейс Graphic) оголошує метод NewGraphic(), який створює екземпляр продукту. Підкласи Staff та MusicalNote повертають конкретний продукт.
Інтерфейс продукту визначено в абстрактному класі Tool. В якості конкретних продуктів виступають підкласи GraphicToolMusicalNote та GraphicToolStaff.
Рисунок 1. Музичний редактор. Реалізація з допомогою паттерну Factory Method
При використанні паттерну Factory Method відбувається комбінаторне зростання кількості підкласів, які майже нічого не виконують. Це є основний недолік.
Інше рішення задачі музичного редактора пропонує паттерн Abstract Factory (рисунок 2). Тут створюються дві ієрархії класів. Перша ієрархія – це класи, що створюють продукт. Ця ієрархія визначається інтерфейсом GraphicFactory, через який повертаються екземпляри конкретних продуктів. З інтерфейсу GraphicFactory отримуються конкретні продукти з допомогою підкласів Staff та MusicalNote.
Друга ієрархія класів визначає отримуваний продукт, у вершині якої описується клас GraphicTool. Для представлення конкретного продукту в ієрархії визначено два додаткових підкласи StaffProduct та MusicalNoteProduct. Клієнт отримує продукт через інтерфейс GraphicTool.
Рисунок 2. Музичний редактор. Реалізація з допомогою паттерну Abstract Factory
Перевага паттерну Abstract Factory перед паттерном Factory Method проявляється у випадку, коли ієрархія класів Graphic Factory вже існує і її не потрібно створювати.
Недолік даного паттерну порівняно з паттерном Prototype є створення додаткових класів, що призводить до зростання загальної ієрархії класів.
І, наостанок, рішення задачі з допомогою паттерну Prototype (рисунок 3). Тут специфічні ноти та нотні стани клонуються (копіюються) в GraphicTool через інтерфейс Graphic. На рисунку 3 представлена діаграма класів розв’язку задачі з допомогою паттерну Prototype.
Рисунок 3. Музичний редактор. Рішення з допомогою паттерну Prototype
Перевага використання паттерну Prototype порівняно з паттернами Factory Method (рисунок 1) та Abstract Factory (рисунок 2) – тут потрібно реалізовувати тільки метод Clone(). Це зменшує кількість підкласів.
⇑
Споріднені теми
- Паттерн Abstract Factory. Розв’язок задачі про складові комп’ютера
- Factory Method. Реалізація структури на C++
- Паттерн Prototype. Реалізація структури на C++
⇑