Ich habe also eine Fabrik, die Objekte verschiedener Klassen erstellt. Die möglichen Klassen stammen alle von einem abstrakten Vorfahren. Die Factory verfügt über eine Konfigurationsdatei (JSON-Syntax) und entscheidet abhängig von der Konfiguration des Benutzers, welche Klasse erstellt werden soll.
Um dies zu erreichen, verwendet die Factory boost :: property_tree für das JSON-Parsing. Er geht durch den Baum und entscheidet, welches konkrete Objekt er erstellt.
Die Produktobjekte haben jedoch viele Felder (Attribute). Abhängig von der konkreten Klasse hat das Objekt ungefähr 5-10 Attribute, in Zukunft vielleicht sogar mehr.
Ich bin mir also nicht sicher, wie der Konstruktor der Objekte aussehen soll. Ich kann mir zwei Lösungen vorstellen:
1) Der Konstruktor des Produkts erwartet jedes Attribut als Parameter, sodass der Konstruktor mehr als 10 Parameter erhält. Dies ist hässlich und führt zu langen, unlesbaren Codezeilen. Der Vorteil ist jedoch, dass die Factory den JSON analysieren und den Konstruktor mit den richtigen Parametern aufrufen kann. Die Produktklasse muss nicht wissen, dass sie aufgrund der JSON-Konfiguration erstellt wurde. Es muss nicht wissen, dass es sich überhaupt um JSON oder Konfiguration handelt.
2) Der Konstruktor des Produkts erwartet nur ein Argument, das property_tree-Objekt. Dann kann es die benötigten Informationen analysieren. Wenn Informationen in der Konfiguration fehlen oder außerhalb der Grenzen liegen, kann jede Produktklasse ordnungsgemäß reagieren. Die Fabrik muss nicht wissen, welche Argumente von den verschiedenen Produkten benötigt werden. Das Werk muss auch nicht wissen, wie es bei falscher Konfiguration reagieren soll. Und die Konstruktorschnittstelle ist einheitlich und klein. Als Nachteil muss das Produkt jedoch die erforderlichen Informationen aus dem JSON extrahieren, damit es weiß, wie es aufgebaut ist.
Ich bevorzuge eher Lösung 2). Ich bin mir jedoch nicht sicher, ob dies ein gutes Fabrikmuster ist. Es fühlt sich irgendwie falsch an, das Produkt wissen zu lassen, dass es mit der JSON-Konfiguration erstellt wurde. Auf der anderen Seite können neue Produkte sehr einfach eingeführt werden.
Irgendwelche Meinungen dazu?