J’avais laissé en exercice à la fin du dernier tutorial sur les factories un petit exercice… face au nombreux mail de votre par je publie la réponse.
Donc pour rappel, nous avons a notre disposition une classe Factory qui nous permet de créer des instances d’objets héritant tous d’une interface de base.
i.e. Shape était notre interface Cylinder, Sphere nos instance a créer.
Le désavantage principal de l’implémentation était l’obligation d’écrire dans chaque classe une méthode statique créant l’instance :
static Shape *Sphere::create(void); |
Heureusement, les template vont encore une fois nous aider a nous abstraire de cette contrainte.
La factory retourne des objets de type Object (paramètre de la classe templatée) elle stocke pour chaque clef une fonction dont le prototype est :
Object *()(void); |
L’idée va être de ne plus stocker une fonction mais un objet au sens C++ jouant le rôle de cette fonction.
Dans notre cas, le foncteur a donc une méthode CreateInstance(void) retournant un Object
template struct InterfaceCreator{ virtual Object *CreateInstance(void) = 0; }; |
on modifie en conséquence la classe Factory :
template class Factory{ public: // on redéfinit notre nouveau type comme // etant un InterfaceCreator<object width="100" height="100" type="application/x-shockwave-flash"></object> |
Maintenant, il nous faut specialiser des Creator pour notre Sphere, Shape, etc…
template class Creator : public InterfaceCreator { public: BaseClass *CreateInstance(void){ RealClass instance = new RealClass(); return static_cast(instance); } }; |
Petite explication de cette double paramétrisation. Nous avons besoin du type réel de l’objet (Sphere) pour le créer et le type abstrait(Shape) pour pouvoir heriter de InterfaceCreator
Passons a l’utilisation :
Factory shapeFactory; ... class Sphere : public Shape{ .... static bool registered; }; bool Sphere::registered = shapeFactory.register("Sphere", new Creator ); bool Cylinder::registered = shapeFactory.register("Cylinder", new Creator ); |
j’espère que ca vous aura plu un minimum ![]()
a+
Twxs


#1 by fiwedding - juillet 30th, 2010 at 02:55
On a aussi fait un compilo en JavaCC. C’est rigolo comme tout mais ça manque de rigueur. Et c’est en Java.