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

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

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