- 1. Ziele
- 2. Probleme
- 3. Diskussion
- 4. Struktur
- 5. Beispiel
- 6. Kontrollliste
- 7. Faustregeln
Ziele
- Wir definieren eine Schnittstelle zum Erstellen eines Objekts, lassen aber die Unterklassen entscheiden, welche Klasse erstellt werden soll. Mit einer Factory-Methode können Sie eine Klasse für Unterklassen instanziieren.
- Definition eines "virtuellen" Konstruktors.
- Der neue Operator ist schädlich.
Probleme
Die Entwurfsstruktur sollte das Architekturmodell über eine Reihe von Anwendungen hinweg standardisieren, ermöglicht es jedoch einzelnen Anwendungen, ihre eigenen Objekte zu definieren und ihre eigenen Regeln zum Erstellen von Objekten bereitzustellen, während eine konsistente Objekterstellungsschnittstelle beibehalten wird.
Diskussion
Die Factory-Methode besteht darin, Objekte als Vorlagenmethode zu erstellen, um den Objekterzeugungsalgorithmus zu implementieren. Die Superklasse definiert das gesamte standardmäßige und generische Verhalten (unter Verwendung rein virtueller „Methoden“, um die Schritte der Objekterstellung zu implementieren) und delegiert dann die Details der Objekterstellung an Unterklassen, die den Clients offengelegt werden.
Die Factory-Methode macht das Anwendungsdesign anpassbarer und nur geringfügig komplexer. Andere Entwurfsmuster erfordern neue Klassen, während Factory Method nur eine neue Operation erfordert.
Die Fabrikmethode wird oft als Standardmethode zum Erstellen von Objekten verwendet. Dies ist jedoch nicht erforderlich, wenn: sich die Instanz der erstellten Klasse nie ändert oder die Instanziierung in einer Operation erstellt wird, die von Unterklassen leicht überschrieben werden kann (z. B. eine Initialisierungsoperation).
Eine Fabrikmethode ähnelt einer abstrakten Fabrik, jedoch ohne den Fokus auf die Objektfamilie.
Factory-Methoden werden typischerweise von der Architektur definiert und dann vom Benutzer des Frameworks implementiert.
Struktur
Die Implementierung der Factory-Methode, die in Gang of Four diskutiert wird, ist weitgehend die gleiche wie die Implementierung der Abstract Factory. Aus diesem Grund konzentriert sich die Darstellung in diesem Artikel auf den seitdem populär gewordenen Ansatz.
Eine immer beliebtere Definition einer Factory-Methode ist eine statische Klassenmethode, die ein Objekt des Typs dieser Klasse zurückgibt. Aber im Gegensatz zu einem Konstruktor kann das eigentliche Objekt, das er zurückgibt, eine Instanz einer Unterklasse sein. Im Gegensatz zu einem Konstruktor kann anstelle eines neu erstellten Objekts ein vorhandenes Objekt wiederverwendet werden. Im Gegensatz zu einem Konstruktor können Factory-Methoden andere und aussagekräftigere Namen haben (z. B. Color.make_RGB_color (rot schwebend, grün schwebend, blau schwebend) und Color.make_HSB_color (Farbton schwebend, Sättigung schwebend, Helligkeit schwebend).
Der Client ist vollständig von den Implementierungsdetails der abgeleiteten Klassen getrennt. Es ist jetzt möglich, Polymorphismus zu verwenden.
Beispiel
Eine Factory-Methode definiert eine Schnittstelle zum Erstellen von Objekten, ermöglicht jedoch den Unterklassen zu entscheiden, welche Klassen erstellt werden sollen. Spritzgussformen zeigen dieses Muster. Kunststoffspielzeughersteller verarbeiten Kunststoffformpulver und spritzen den Kunststoff in Formen mit gewünschten Eigenschaften. Die Klasse von Spielzeug (Auto, Actionfigur usw.) wird durch die Form bestimmt.
Kontrollliste
- Wenn Sie eine Vererbungshierarchie haben, die Polymorphismus unterstützt, sollten Sie erwägen, die Möglichkeit hinzuzufügen, polymorphe Objekte zu erstellen, indem Sie eine statische Factory-Methode in der Basisklasse definieren.
- Entwickeln Sie Argumente für die Factory-Methode. Welche Qualitäten oder Merkmale sind notwendig und ausreichend, um die richtige abgeleitete Klasse zum Instanziieren zu identifizieren?
- Erwägen Sie die Erstellung eines internen "Objektpools", der es ermöglicht, Objekte wiederzuverwenden, anstatt sie von Grund auf neu zu erstellen.
- Erwägen Sie, alle Konstruktoren privat oder geschützt zu machen
Faustregeln
- Abstrakte Factory-Klassen werden oft mit Factory-Methoden implementiert, aber sie können mit Prototype implementiert werden.
- Factory-Methoden werden normalerweise in Template-Methoden aufgerufen.
- Factory-Methode: Erstellung durch Vererbung. Prototyp: Erstellung per Delegation.
- Oft beginnen Projekte mit der Factory-Methode (weniger komplex, anpassbar, Unterklassen nehmen zu) und entwickeln sich zu Abstract Factory, Prototype oder Builder (flexibler, komplexer), wenn der Entwickler feststellt, dass mehr Flexibilität erforderlich ist.
- Prototyp benötigt keine Unterklassen, aber eine Initialisierungsoperation. Die Factory-Methode erfordert das Erstellen von Unterklassen, erfordert jedoch keine Initialisierung.
- Der Vorteil einer Factory-Methode besteht darin, dass sie dieselbe Instanz mehrmals zurückgeben kann, oder dass sie eher eine Unterklasse als ein Objekt genau dieses Typs zurückgeben kann.
- Einige Befürworter von Factory-Methoden empfehlen, dass in Bezug auf das Sprachdesign (oder den Stil) absolut alle Konstruktoren privat oder geschützt sein sollten.
- Der neue Operator gilt als schädlich. Es gibt einen Unterschied zwischen dem Anfordern eines Objekts und dem Erstellen. Der Operator new erstellt immer ein Objekt und kann die Objekterstellung nicht kapseln. Die Factory-Methode nutzt diese Kapselung und ermöglicht es Ihnen, ein Objekt abzufragen, ohne an den Erstellungsvorgang gebunden zu sein.