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.
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. –
Wenn Sie keine anderen SoundObject-Subtypen haben, würde ich "Nein" sagen. – duffymo
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 –