Vous êtes sur la page 1sur 3

Prototype Tip i scop: ablon crea ional; evit crearea de noi obiecte prin intermediul operatorului new atunci

cnd acest lucru este prohibitiv; Prototype: instan responsabil pentru crearea celorlalte obiecte prin clonare.

Participan i: Prototype: declararea interfe ei pentru clonare; ConcretePrototype: implementarea opera iei de clonare; Client: construie te un nou obiect cerndu-I prototipului s se cloneze; Exemplu:
#include <vector> #include <string> #include <iostream> using namespace std; enum pizzaID {MarguerittaID, MarinaraID, UnknownPizzaID }; // Product class IPizzaNapoletana { public: void printName() { cout << pizzaName << endl; } // client calls this public static member function when it needs an instance of an IPizzaNapoletana subclass static IPizzaNapoletana* Clone( pizzaID id) { int nPizzaTypes = prototypeCollection.size(); for (int i = 0; i < nPizzaTypes; ++i)

{ if ( prototypeCollection[i]->returnID() == id) { return prototypeCollection[i]->makeSpecificClone(); } } return NULL; } private: static vector<IPizzaNapoletana*> prototypeCollection; // addPrototype() saves each prototype object here protected: // each subclass of IPizzaNapoletana registers its prototype static void addPrototype(IPizzaNapoletana* pizza) { prototypeCollection.push_back( pizza ); } virtual pizzaID returnID() = 0; virtual IPizzaNapoletana* makeSpecificClone() = 0; string pizzaName; }; vector<IPizzaNapoletana*> IPizzaNapoletana::prototypeCollection; // ConcreteProduct1 class Margueritta : public IPizzaNapoletana { private: // this is subclass's prototype object // default ctor will be called, which registers it static Margueritta _objectMargueritta; // this is only called when the private static data member is inited Margueritta() { pizzaName = "Margueritta"; addPrototype(this); } protected: /*virtual*/ pizzaID returnID() { return MarguerittaID; } /*virtual*/ IPizzaNapoletana* makeSpecificClone() { // call copy constructor return new Margueritta( _objectMargueritta ); } }; // ConcreteProduct2 class Marinara : public IPizzaNapoletana { private: // this is subclass's prototype object // default ctor will be called, which registers it static Marinara _objectMarinara; // this is only called when the private static data member is inited Marinara() { pizzaName = "Marinara"; addPrototype(this); } protected: /*virtual*/ pizzaID returnID() {

return MarinaraID; } /*virtual*/ IPizzaNapoletana* makeSpecificClone() { return new Marinara( _objectMarinara ); } }; // register the prototypes Margueritta Margueritta::_objectMargueritta; Marinara Marinara::_objectMarinara; int main() { const int HOW_MANY__PIZZA = 5; pizzaID input[HOW_MANY__PIZZA] = { MarguerittaID, MarinaraID, MarinaraID, UnknownPizzaID, MarguerittaID }; IPizzaNapoletana* pizza[HOW_MANY__PIZZA]; // given an pizza ID, find the right prototype, and return a clone for (int i = 0; i < HOW_MANY__PIZZA; ++i) pizza[i] = IPizzaNapoletana::Clone(input[i]); // demonstrate that correct image objects have been cloned for (i = 0; i < HOW_MANY__PIZZA; ++i) { if ( NULL != pizza[i] ) { pizza[i]->printName(); } else { cout << "Bad pizza ID!" << endl; } } // free the dynamic memory for (i = 0; i < HOW_MANY__PIZZA; ++i) delete pizza[i]; return 0; }

Vous aimerez peut-être aussi