Ich versuche, ein gutes Entity-Creation-System mit einer abstrakten Factory zu entwerfen (wie in Ссылка ), aber Ich kämpfe, wenn es um bestimmte Parameter geht.
Zum Beispiel: Ich habe zwei abstrakte Fabriken, eine zum Erstellen eines Projektils und eine zum Erstellen einer Kiste.
Nun kann die Factory entweder eine Instanz für jeden Typ sein, die einen abstrakten Parametersatz aus einer Liste (die in der Basisklasse freigegebenes Material, Größe etc.) übergeben würde, typspezifische Parameter wäre Geschwindigkeit für ein Projektil und Haltbarkeit für eine Kiste.
Aber was ich damit zu tun habe, ist, dass ich am Ende, wenn ich diese abstrakte Fabrikmethode habe, die ich Parameter wie "BulletProjectile" und "WeakCrate" nenne, instanzspezifische Parameter und, was noch wichtiger ist Sie sind für verschiedene Fabriken von unterschiedlicher Art - für Geschosse hätten sie Position und Geschwindigkeit und die Kiste hätte nur eine Position. Ein schlimmeres Szenario ist, wenn der Benutzer oder Spieler eine Kiste oder ein ähnliches Objekt erstellt und seine Dimensionen definieren kann. Wie würde ich damit umgehen?
Einige Optionen:
Überdenken Sie Ihre Verwendung
Eine abstrakte Fabrik ist nützlich, wenn sie den Benutzer der Fabrik von der Herstellung des genauen Typs trennt. Die abstrakte Fabrik hat keine Beschränkungen, was sie produziert, nur dass sie abstrakt ist. Es kann einen nicht abstrakten Typ oder einen abstrakten Typ zurückgeben, der nicht an der Basis Ihrer Vererbungshierarchie liegt.
Wenn Code, der die Factory bereits verwendet, verschiedene Datensätze erhalten kann, mit denen er die Factory aufrufen kann, dann hat der Code, der die Factory verwendet, bereits einige Kenntnisse über den Typ, der daraus hervorgeht.
Hier sind einige Optionen zum Nachdenken:
Create
-Methode an, z. B. GrenadeFactory
und BulletFactory
.
CreateBullet
und CreateGrenade
.
Denken Sie daran, dass Sie immer noch einen abgeleiteten Typ ( Bullet
) an eine Methode übergeben können, die einen Basistyp verwendet (zB Entity
oder Projectile
).
Doppelter Versand
Wenn Sie wirklich an der Kombination von abstrakten Fabriken mit abstrakten Parametern interessiert sind, dann sollten Sie sich die Doppelausgabe oder das ansehen Besuchermuster Der Schlüssel hier ist, dass Sie versuchen, zwei verschiedene virtuelle Methoden miteinander zu kombinieren, und erhalten Sie eine einzigartige Kombination von Verhalten auf der Grundlage dieser beiden abgeleiteten Typen.
Dazu müssten Sie Basis- und abgeleitete Typen für Ihre Parameter erstellen, sodass Sie keine einfachen Typen (wie int, string usw.) übergeben können, ohne eine benutzerdefinierte Parameterstruktur zu erstellen, die von einer Basis Parameters
type abgeleitet ist.
Es erfordert auch viel zusätzlichen Code, um das Besuchermuster zu implementieren.
RTTI
Sie können die C ++ - Laufzeittyp-Informationsfunktion verwenden.
Mit dynamic_cast
können Sie einen Basistyp in einen abgeleiteten Typ umwandeln. Sie könnten dies in der Factory-Implementierung tun, um den Basisparametertyp an Ihren spezifischen Parametertyp zu übergeben.
Wie beim Double-Dispatch müssen Sie auch eine Typhierarchie für Parameter erstellen, benötigen aber weniger Code, um sie zusammenzufassen (ohne das Besuchermuster).
Diese Option würde Ihre Factory-Implementierung jedoch eng an eine Implementierung der Parameterstruktur koppeln.
Eigenschaftstasche
Sie können auch eine string
- & gt; some type
dictionary ( string
- & gt; boost::any
, zum Beispiel). Dies wird eine Eigentumstasche genannt. Sie verlieren jedoch viel Sicherheit beim Kompilieren, weil Sie im Prinzip alles nach Zeichenfolgenwerten suchen. Ich kann es nicht wirklich empfehlen.
Tags und Links c++ factory-pattern