Bonjour à tous,
Je travaille actuellement sur une grosse lib de traitement d'images, qui repose entièrement sur le pattern fabrique. En fait, tous les objets sont instanciés à partir d'un fichier xml de configuration contenant le nom des classes à utiliser (c'est d'ailleurs un peu perturbant comme système).
J'avais l'habitude de voir les fabriques sous la forme d'une classe de base offrant la fonction virtuelle clone(), avec insertion d'un objet de chaque classe dans une map<string,ClassPrototype*>.
Cette lib offre un mécanisme un peu particulier basé sur les macro : toutes les classes utilisent la macro suivante dans leur déclaration:
Une autre macro , REGISTER_CLASS(MaClasse):
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 #define DECLARE_CLASS( __NAME__) \ static ObjectInterface* create() \ {\ return new __NAME__(); \ }
permet d'enregistrer la classe dans ce qui semble être une map<string, pointeur de fonction >
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 #define REGISTER_CLASS(__NAME__) \ ObjectInterfaceFactory::instance().registerObject(QString(#__NAME__),__NAME__::create);
Il semble que l'utilité du système soit d'éviter l'instantiation d'un objet de chaque type (vu le nombre de classe, ça se justifie). Cette utilisation de la fabrique est-elle courante (Je l'ai également vu dans wxWidget) et pose-elle des problèmes de conception majeurs (faut aimer les macros)?
Partager