2010-02-11 10 views
5

Ich habe noch nie Fabriken aus dem einfachen Grund verwendet, ich verstehe nicht, wenn ich sie brauche. Ich habe in meiner Freizeit an einem kleinen Spiel gearbeitet, und ich habe beschlossen, FMOD für den Sound zu implementieren. Ich sah einen Wrapper für OpenAL (verschiedene Sound-Setup) entworfen und es sah so etwas wie ...Fabriken verstehen und sollte ich sie benutzen?

Klangobjekt * SoundObjectManager * SoundObjectFactory *

Das Klangobjekt war im Grunde die Instanz jedes Klangobjekt. Der SoundObjectManager verwaltet nur alle diese Objekte. Das ist einfach genug und macht viel Sinn, aber ich verstehe nicht, was die Fabrik macht oder wofür sie gebraucht wird. Ich habe Factorys gelesen, verstehe sie aber immer noch nicht.

Jede Hilfe wäre willkommen!

Antwort

2

Denken Sie an Factory als "virtueller Konstruktor". Sie können Objekte mit einem gemeinsamen Kompilierungszeittyp, aber unterschiedlichen Laufzeittypen erstellen. Sie können das Verhalten einfach ändern, indem Sie der Factory mitteilen, dass sie eine Instanz eines anderen Laufzeittyps erstellen soll.

+0

Also für so etwas wird es wirklich nicht benötigt? Bedenkt, dass ich immer nur Instanzen von SoundObject * und nur einen Singleton des Managers verwenden werde. –

+0

Wenn Sie keine anderen SoundObject-Subtypen haben, würde ich "Nein" sagen. – duffymo

+0

Nicht wirklich, Die Absicht bei der Verwendung des Musters besteht darin, die Erzeugung von Objekten von ihrer Verwendung zu isolieren. Dies ermöglicht die Einführung neuer abgeleiteter Typen ohne Änderung des Codes, der die Basisklasse verwendet. Sie haben wahrscheinlich Subtypen von SoundObject, aber Sie wissen es einfach nicht, die Fabrik isoliert Sie von diesen Implementierungsdetails –

1

Fabriken werden verwendet, wenn die Implementierung parametrisiert werden muss. FMOD ist plattformübergreifend, es muss entscheiden, welche konkrete Implementierung Sie für Ihre Plattform erhalten. Das macht die Fabrik. Es gibt zwei Hauptmuster Abstract Factory Pattern und Factory Method Pattern.

1

Hypothetische Situation: Ich schreibe eine Sound-Bibliothek, die ich auf mehreren Plattformen ausführen möchte. Ich werde versuchen, so viel Code wie möglich plattformunabhängig zu machen, aber sicherlich wird sich einiges davon für Windows gegenüber OSX im Vergleich zu Linux ändern müssen.

Also schreibe ich alle diese verschiedenen Implementierungen, aber ich möchte nicht, dass der Endbenutzer ihr Programm abhängig von Linux oder Windows oder was auch immer machen muss. Ich möchte auch nicht 4 verschiedene Schnittstellen zu meiner API pflegen. (Beachten Sie, dass dies nur einige der Gründe sind, warum Sie eine Fabrik gründen könnten - es gibt sicherlich andere Situationen).

Also definiere ich diese nette generische SoundObject Basisklasse, die alle Methoden definiert, die der Client verwenden soll. Dann mache ich meine LinuxSoundObject, WindowsSoundObject, und 5 andere leiten sich von SoundObject ab. Aber ich werde alle diese konkreten Implementierungen vor dem Benutzer verstecken und ihnen nur eine SoundObject geben. Stattdessen müssen Sie meinen SoundObjectFactory anrufen, um zu greifen, was Ihnen scheint, um ein einfaches altes SoundObject zu sein, aber wirklich habe ich den korrekten Laufzeittyp für Sie gewählt und es mich instanziiert.

2 Jahre später kommt ein neues Betriebssystem auf und verdrängt Windows. Anstatt Sie zu zwingen, Ihre Software neu zu schreiben, aktualisiere ich einfach meine Bibliothek, um die neue Plattform zu unterstützen, und Sie sehen nie eine Änderung an der Schnittstelle.

Das ist alles schön erfunden, aber hoffentlich bekommen Sie die Idee.

Fabriken isolieren Verbraucher einer Schnittstelle, von dem Laufzeittyp (d. H. Implementierung) tatsächlich verwendet wird.

+0

Das macht vollkommen Sinn, sollten Sie in das Schreiben von C++ für Dummies Bücher lol suchen. Soweit der Link geht, habe ich im Kommentar oben gepostet, ich bin immer noch nicht genau sicher, was er tut, aber es sieht aus wie hes mit der Fabrik, um es in ein MovableObject zu verwandeln, aber ich verstehe das nicht wirklich. Da dies nur ein Lernprojekt ist, werde ich jetzt ohne eins auskommen und ich werde wissen, wann ich eines in der Zukunft brauchen werde. –

+0

Dies ist nicht C++ - spezifisch, es ist ein allgemeines Entwurfsmuster für alle OO-Sprachen (und einige Nicht-OO-Sprachen) –

0

Fabriken können verwendet werden, um die Umkehrung der Steuerung zu implementieren und den Instanziierungscode (die "neuen") von der Logik Ihrer Komponenten zu trennen. Dies ist hilfreich, wenn Sie Komponententests schreiben, da Sie nicht möchten, dass getestete Objekte eine Menge anderer Objekte erstellen.

Verwandte Themen