Прототип (шаблон проектування)

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук

Прототип (англ. 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