Ich weiß nicht, ob es einen offiziellen Namen dafür gibt, aber ich habe mit dem gespielt, was ich gerne das "Self-Factory" -Muster nenne. Im Grunde ist es, wenn eine abstrakte Basisklasse als eine Fabrik für sich selbst agiert. Lassen Sie mich erklären:Das Muster "Self-Factory"
Ich habe Foo-Objekte und Bar-Objekte in meinem System, die über Schnittstellen FooInterface und BarInterface verwendet werden. Ich muss meinen Kunden die richtige Art von Foo und Bar geben. Die Entscheidung, welches konkrete Foo-Objekt erstellt werden soll, wird zur Kompilierzeit getroffen. Wenn Sie beispielsweise unter Win32 kompilieren, möchten Sie nur Win32Foo-Objekte erstellen. Wenn Sie unter OSX kompilieren, möchten Sie nur OSXFoo-Objekte usw. erstellen. Die Entscheidung, welches konkrete Bar-Objekt erstellt werden soll, wird jedoch zur Laufzeit basierend auf einer Schlüsselzeichenfolge getroffen.
Jetzt ist meine Frage über die beste Möglichkeit, dieses Schema zu implementieren. Ein Weg, ich komme mit verwendet reguläre Fabriken:
shared_ptr<FooInterface> foo = FooFactory::create();
shared_ptr<BarInterface> happyBar = BarFactory::create("Happy");
shared_ptr<BarInterface> sadBar = BarFactory::create("Sad");
Ein anderer Weg ist zu verwenden, was ich als „self-Fabriken“:
shared_ptr<FooInterface> foo = FooInterface::create();
shared_ptr<BarInterface> happyBar = BarInterface::create("Happy");
shared_ptr<BarInterface> sadBar = BarInterface::create("Sad");
Was sind die Vor- und Nachteile der einzelnen Ansätze, die beide aus ein Usability-Standpunkt und von einem architektonischen Standpunkt?
Ich denke, was Sie als Self-Factory vorschlagen, wird auch das Prototype-Muster genannt. Sie können wahrscheinlich Literatur über dieses Muster für Ideen überprüfen. –