Es gibt einen netten Trick, mit dem Sie eine factory method ohne eine Sequenz von if...else if...
schreiben können.
(beachten Sie, dass, AFAIK, es in der Tat nicht möglich ist, zu tun, was Sie in C wollen ++ wie dieser Code in der Kompilierung erzeugt wird. Eine „Factory Method“ Design Pattern für diesen Zweck existiert)
Sie
Erstens Definieren Sie eine global repository
für Ihre abgeleiteten Klassen. Sie kann in der Form std::map<std::string, Base*>
vorliegen, d. H. Sie bildet einen Namen der abgeleiteten Klasse zu an instance
dieser Klasse.
Für jede abgeleitete Klasse definieren Sie eine default constructor
, die ein Objekt dieser Klasse dem Repository unter dem Namen der Klasse hinzufügt.Sie können auch eine statische Instanz der Klasse definieren:
// file: der1.h
#include "repository.h"
class Der1: public Base {
public:
Der1() { repository[std::string("Der1")] = this; }
};
// file: der1.cpp
static Der1 der1Initializer;
Konstrukteurs von statischen Variablen, noch bevor main()
ausgeführt werden, so dass, wenn Ihr main
beginnt bereits das Repository mit Instanzen aller abgeleiteten Klassen initialisiert haben.
Ihre Factory-Methode (z. B. Base::getObject(const std::string&)
) muss die Repository-Map nach dem Klassennamen durchsuchen. Anschließend wird die Methode clone()
des gefundenen Objekts verwendet, um ein neues Objekt desselben Typs zu erhalten. Sie müssen natürlich clone
für jede Unterklasse implementieren.
Der Vorteil dieses Ansatzes besteht darin, dass beim Hinzufügen einer neuen abgeleiteten Klasse die Zusätze nur auf die Datei (en) beschränkt sind, die die neue Klasse implementieren. Das Repository und der Fabrikcode werden nicht geändert. Sie müssen natürlich Ihr Programm neu kompilieren.
Dies klingt eine OS-spezifische Frage. Über welches Betriebssystem reden wir? –
@sad_man, bitte update. Ich brauche eine plattformübergreifende Version. – Ockonal
Wie kann "die Anzahl der Derivate" änderbar sein? Sind Sie bereit, die Derivate aus einer externen Bibliothek aufzurufen, die nach Ihrer Anwendung kompiliert wird? –