In diesem Beispiel wird ein Objekt vom Typ Mac
und es kann nie anders alles sein:
$mac = new Mac();
Es ist nicht eine Unterklasse von Mac
sein kann, kann es nicht eine Klasse sein, die die Schnittstelle von Mac
übereinstimmt.
Während das folgende Beispiel ein Objekt vom Typ Mac
oder einen anderen Typ, den die Fabrik entscheidet, zurückgeben kann.
$appleStore = new AppleStore();
$mac = $appleStore->getProduct('mac');
Sie könnten eine Reihe von Unterklassen von Mac
wollen, die jeweils ein anderes Modell von Mac darstellt. Dann schreiben Sie in der Fabrik Code, um zu entscheiden, welche dieser Unterklassen verwendet werden soll. Mit dem Operator new
können Sie das nicht tun.
So eine Fabrik gibt Ihnen mehr Flexibilität bei der Erstellung von Objekten. Flexibilität geht oft einher mit der Entkopplung.
Re Ihr Kommentar: Ich würde nicht sagen, nie Verwendung new
. In der Tat verwende ich new
für die Mehrheit der einfachen Objekterstellung. Aber es hat nichts damit zu tun, wer den Client-Code schreibt. Das Factory-Muster ist für eine Architektur gedacht, in der die Klasse dynamisch instanziiert werden kann.
In Ihrem Apple Store-Beispiel möchten Sie wahrscheinlich einen einfachen Code, um ein Produkt zu instanziieren und in einen Einkaufswagen zu legen. Wenn Sie new
verwenden und Sie unterschiedliche Objekttypen für jeden unterschiedlichen Produkttyp haben, müssen Sie eine große case
-Anweisung schreiben, damit Sie ein new
-Objekt des entsprechenden Typs erstellen können. Jedes Mal, wenn Sie einen Produkttyp hinzufügen, müssen Sie diese case
-Anweisung aktualisieren. Und Sie könnten mehrere dieser case
Aussagen in anderen Teilen Ihrer Anwendung haben.
Wenn Sie eine Factory verwenden, benötigen Sie nur einen Aktualisierungsort, der weiß, wie ein Parameter zu übernehmen ist und den richtigen Objekttyp instanziiert. Alle Orte in Ihrer App würden implizit Unterstützung für den neuen Typ erhalten, ohne dass Codeänderungen erforderlich sind. Das ist ein Gewinn, egal ob du der einzige Entwickler bist oder in einem Team bist.
Aber wieder brauchen Sie keine Fabrik, wenn Sie nicht eine Vielzahl von Subtypen unterstützen müssen. Verwenden Sie einfach weiter in einfachen Fällen new
.
Diese zweite scheint eher eine Beziehung als eine Fabrik für mich ...? – SeanJA