Complément du tuto sur la classe Factory


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. #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.

(will not be published)
  1. No trackbacks yet.