Eine andere Möglichkeit besteht darin, dynamisch eine Ersteller Funktion auf ein dynamisches Factory-Objekt.
BluePen *create_BluePen() { return new BluePen; }
static bool BluePen_creator_registered =
Factory::instance()->registerCreator("BluePen",
create_BluePen);
Ein interessanter Effekt dieser Vorgehensweise ist, dass die statische bool-Variable BluePen-creator-registered
wird vorher festgelegt main()
beginnt, wodurch die Registrierung automatisiert wird.
Diese Zeilen werden manchmal durch gewöhnliche Makros erstellt, z.B. als
#define METAIMPL( _name ) \
_name *create_ ## _name() { return new _name; } \
static bool _name ## _creator_registered = \
Factory::instance()->registerCreator(# _name, \
create_ ## _name)
...und in der Nähe des Konstruktors verwendet
METAIMPL( BluePen ); // auto registers to the Factory
BluePen::BluePen() : Pen() {
// something
}
Die Aufgabe der Fabrik besteht dann darin, diese Daten zu speichern und nachzuschlagen. Ersteller Funktionen. Den Rest lasse ich als die Übung ;) d.h. die Verwendung eines METADECL-Makros
Wenn Sie mehr Informationen wünschen, siehe aquí unter Kapitel 4.1 Meta-Informationen die auch eine Methode zur Erweiterung um Möglichkeiten für Inspektor Merkmale
Das habe ich gelernt, als ich ET++ das war ein Projekt zur Portierung der alten MacApp nach C++ und X11. Im Zuge dessen begann Eric Gamma usw., sich Gedanken über Entwurfsmuster
Und...(7. Mai 2011) Endlich bin ich dazu gekommen, ein Beispiel auf Github zu veröffentlichen
https://github.com/epatel/cpp-factory