Прототип (шаблон проектування)
Прототип (англ. Prototype) - шаблон проектування, відноситься до класу твірних шаблонів.
Зміст
Призначення[ред. • ред. код]
Задає види об'єктів, що створюються, за допомогою екземпляру-прототипу, та створює нові об'єкти шляхом копіювання цього прототипу.
Застосування[ред. • ред. код]
Слід використовувати шаблон Прототип коли:
- класи, що інстанціюються, визначаються під час виконання, наприклад за допомогою динамічного завантаження;
- треба запобігти побудові ієрархій класів або фабрик, паралельних ієрархій класів продуктів;
- екземпляри класу можуть знаходитись у одному з не дуже великої кількості станів. Може статися, що зручніше встановити відповідну кількість прототипів та клонувати їх, а не інстанціювати щоразу клас вручну в слушному стані.
Структура[ред. • ред. код]

UML діаграма, що описує структуру шаблону проектування Прототип
- Prototype – прототип:
- визначає інтерфейс для клонування самого себе;
- ConcretePrototype – конкретний прототип:
- реалізує операцію клонування самого себе;
- Client – клієнт:
- створює новий об'єкт, звертаючись до прототипу із запитом клонувати себе.
Переваги[ред. • ред. код]
- Створює глибоку копію комплексної ієрархії об'єктів
- Зменшення навантаження ініціалізації
- Багаторазові можливості - оптимізовані зусилля щодо кодування
- Спрощений процес копіювання об'єктів:
Недоліки[ред. • ред. код]
- Додаткові витрати на розробку
- Потребує уважності і точності при глибокому копіюванні
Відносини[ред. • ред. код]
Клієнт звертається до прототипу, щоб той створив свого клона.
Реалізація[ред. • ред. код]
Приклад С++[ред. • ред. код]
Приклад реалізації на мові С++
#include <iostream>
#include <string>
#include <vector>
using namespace std;
struct Prototype
{
virtual Prototype* Clone() = 0;
};
class Item : public Prototype
{
public:
int ID;
string Name;
public:
Item(string strName) : Name(strName)
{
ID = GetNewID();
};
// конструктор копіювання
Item(Item& item) : Name(item.Name)
{
ID = GetNewID();
};
virtual ~Item() { };
virtual Prototype* Clone()
{
return new Item(*this);
};
static int GetNewID()
{
static int ID = 0;
return ++ID;
};
};
void print(Prototype* p)
{
Item* pItem = dynamic_cast <Item*> (p);
cout << "ID: " << pItem->ID << endl;
cout << "Name: " << pItem->Name << endl;
cout << endl;
}
void main()
{
vector<Prototype*> items;
Item Item("Concrete Item");
// клонуємо об'єкт
for (int i = 0; i < 10; ++i)
{
items.push_back
(
Item.Clone() // виклик методу клонування
);
}
// Друкуємо клонів
for (int i = 0; i < 10; ++i)
{
print(items[i]);
}
}
Джерела[ред. • ред. код]
Література[ред. • ред. код]
Алан Шаллоуей, Джеймс Р. Тротт. Шаблоны проектирования. Новый подход к объектно-ориентированному анализу и проектированию = Design Patterns Explained: A New Perspective on Object-Oriented Design. — М. : «Вильямс», 2002. — 288 с. — ISBN 0-201-71594-5.
|