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