Salut !
j'ai implémenté un pattern factory, qui construit une classe à partir d'un CString (chaîne de caractères MFC).
Ma classe factory utilise un objet std::Map<CString> qui associe des CString avec des fonctions statiques qui ont pour rôle de faire un new sur leur propre constructeur.
Avec du code (de mémoire), ça donne :
Bon, je sais, c'est bourré d'erreurs, mais j'ai tapé ce code de mémoire, c'est juste pour vous exposer le principe.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 class Frame { // Classe de base de toutes les classes dans le std::map<> }; class FrameA:public Frame { static Frame* constructor() { return new FrameA(); } }; class FrameB:public Frame { static Frame* constructor() { return new FrameB(); } }; class FrameAA:public FrameA { static Frame* constructor() { return new FrameAA(); } }; // --- Quelque part, ailleurs... --- // // Remplissage de la map std::map<CString, Frame*(constructor*) > MonMap; MonMap["evChose"] = FrameA::constructor; MonMap["evBidule"] = FrameB::constructor; MonMap["evMachin"] = FrameAA::constructor; // et encore plus loin, utilisation de la map Frame* pFrame = MonMap[UneVariableDeTypeCString](); // pFrame pointe sur un FrameA, ou FrameB ou FrameAA, etc...
Avec le vrai code, ça marche bien, mais j'aimerai aller plus loin...
Mais tout d'abord, quelques questions :
- est-ce qu'il éxiste des implémentations complètes de référence des design pattern GOF en C++ ?
- est-ce que ma méthode a de gros inconvénients ?
Pour aller plus loin, j'aimerai rendre le CString static à la classe, pour pouvoir remplir mon map comme ceci :
et puis comme cette clé est utilisé dans d'autres map, autant le rendre attribut static const pour chacunes des classes héritant de Frame.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 MonMap[FrameA::m_CStrCle] = FrameA::constructor; MonMap[FrameB::m_CStrCle] = FrameB::constructor; MonMap[FrameAA::m_CStrCle] = FrameAA::constructor;
et là... je me dis que c'est moche, parce que ça ressemble à du code factorisable, qui n'est pas factorisé.
Pour info, dans le vrai logiciel, je n'ai pas trois classes qui héritent de Frame, mais 82....
Donc la question cruciale, et objet de ce long post est :
n'éxisterait-il pas un moyen de créer une liste de classes afin de pouvoir remplir mon Map de façon plus élégante que ce qui est présenté au-dessus ?
Partager