- 1. Голи
- 2. Проблеми
- 3. Обговорення
- 4. Структура
- 5. Приклад
- 6. Контрольний список
- 7. Емпіричні правила
Голи
- Вказати типи об'єктів для створення з використанням екземпляра прототипу та створити нові об'єкти, скопіювавши цей прототип.
- Створити один екземпляр класу для використання як вихідника всіх майбутніх екземплярів.
- Оператор new вважається шкідливим
Проблеми
Програма має жорстку прив'язку до класу об'єкта під час використання оператора new.
Обговорення
Оголосіть абстрактний базовий клас, який визначає чистий віртуальний метод clone і підтримує словник усіх клонованих конкретних похідних класів. Будь-який клас, який потребує можливості «поліморфного конструктора»: витягується з абстрактного базового класу, реєструє його прототипний екземпляр та реалізує операцію clone().
Потім клієнт замість писати код, який викликає оператор new на ім'я похідного класу, викликає операцію «clone» в абстрактному базовому класі, надаючи рядковий або нумерований тип даних, який позначає конкретний похідний клас.
Структура
Фабрика знає, як знайти правильний прототип, і кожен клас знає, як породжувати нові екземпляри себе.
Приклад
Шаблон Prototype вказує тип об'єктів, які створюються з використанням прототипу. p align="justify"> Прототипи нових продуктів часто будуються до повного виробництва, але в цьому прикладі прототип є пасивним і не бере участі в копіюванні. Мітотичний поділ клітини, що призводить до двох ідентичних клітин, є прикладом прототипу, який відіграє активну роль у копіюванні і таким чином демонструє зразок прототипу. Коли клітина розщеплюється, з'являються дві клітини ідентичного генотипу. Іншими словами, клітина сама себе клонує.
Контрольний список
- Додати метод "clone" до існуючої ієрархії класів
- Створіть реєстр, який підтримує кеш прототипових об'єктів. Реєстр може бути інкапсульований у новий клас Factory або базовий клас.
- Створіть фабричний метод, який: може (або може бути ні) приймати аргументи, знаходити правильний об'єкт-прототип, викликати clone() для цього об'єкта та повертати результат.
- Клієнт замінює всі виклики оператора на нові виклики заводського методу.
Емпіричні правила
- Іноді шаблонами створення є конкуренти: трапляються випадки, коли можна використовувати Prototype або Abstract Factory. В інших випадках вони доповнюють один одного: Abstract Factory може зберігати набір прототипів, з яких можна клонувати та повертати об'єкти. Abstract Factory, Builder та Prototype можуть використовувати Singleton у своїх реалізаціях.
- Класи Abstract Factory часто реалізуються за допомогою Factory Methods, але вони можуть бути реалізовані за допомогою Prototype.
- Фабричний метод: створення через успадкування. Прототип: створення делегування.
- Часто проекти починаються з використання Factory Method (менш складні, настроювані, підкласи розмножуються) і розвиваються в напрямку Abstract Factory, Prototype або Builder (гнучкіші, складніші), оскільки розробник виявляє, що потрібно більше гнучкості.
- Прототип не вимагає підкласів, але для цього потрібна операція "іnitіalize". Фабричний метод потребує підкласифікації, але не вимагає ініціалізації.
- Конструкції, які часто використовують шаблони Composite та Decorator, часто можуть також використовувати Prototype.
- Прототип створює один екземпляр класу для використання як творця всіх майбутніх екземплярів.
- Прототипи корисні, коли ініціалізація об'єктів коштує дорого, і ви очікуєте незначних змін параметрів ініціалізації. У цьому контексті Prototype може уникнути дорогого «створення з нуля» та підтримувати дешеве клонування попередньо ініціалізованого прототипу.
- Прототип унікальний серед інших шаблонів створення, оскільки для нього не потрібний клас – лише об'єкт. Об'єктно-орієнтовані мови, такі як Self та Omega, які усувають класи, повністю покладаються на прототипи для створення нових об'єктів.