www.wikidata.de-de.nina.az
Der Begriff Fabrikmethode englisch factory method bezeichnet ein Entwurfsmuster aus dem Bereich der Softwareentwicklung Das Muster beschreibt wie ein Objekt durch Aufruf einer Methode anstatt durch direkten Aufruf eines Konstruktors erzeugt wird Es gehort somit zur Kategorie der Erzeugungsmuster engl creational patterns Das Muster ist eines der sogenannten GoF Entwurfsmuster Gang of Four siehe Viererbande Inhaltsverzeichnis 1 Begriffsbedeutung gemass GoF 2 Abgrenzung 3 UML Diagramm 4 Akteure 5 Vorteile 6 Nachteile 7 Beispiele 8 Anwendungsfalle 8 1 Virtuelle Methode in Schnittstelle oder Klasse 8 1 1 Erzeugen abhangiger Objekte 8 1 2 Erzeugen unabhangiger Objekte uber zentralisierte indizierte Konstruktoren 8 2 Static Factory Method 9 Verwandte Entwurfsmuster 10 Weblinks 11 EinzelnachweiseBegriffsbedeutung gemass GoF BearbeitenGemass GoF bezeichnet die Fabrikmethode ein Muster bei dem die Schnittstelle zur Erstellung eines Objektes eine abstrakte Methode einer Oberklasse ist Die konkrete Implementierung der Erzeugung neuer Objekte findet jedoch nicht in der Oberklasse statt sondern in von ihr abgeleiteten Unterklassen die die besagte abstrakte Methode implementieren Das Muster beschreibt somit die Erzeugung von Produktobjekten deren konkreter Typ ein Untertyp einer abstrakten Produktklasse ist welcher von Unterklassen einer Erzeugerklasse bestimmt wird Es wird manchmal auch als virtueller Konstruktor virtual constructor bezeichnet Abgrenzung BearbeitenDer Begriff Fabrikmethode wird in der Praxis auch oft einfach nur fur eine statische Methode verwendet die ein neues Objekt erzeugt vergleichbar einem Konstruktor Beispiel Statt SomeObject o new SomeObject wird unter Verwendung der umgangssprachlich als Fabrikmethode bezeichneten statischen Methode geschrieben SomeObject o SomeObjectFactory createNewInstance In diesem Fall ist fur den Methodenaufruf selbst keine Verwendung von Unterklassen bzw Polymorphie vorgesehen jedoch ist meist Ziel dass das erzeugte zuruckgegebene Objekt abhangig von der Umgebung oder von createNewInstance mitgegebenen Parametern von einer Unterklasse von SomeObject ist Diese Verwendung des Begriffes Fabrikmethode ist jedoch nicht korrekt im Sinne der Gang of Four UML Diagramm BearbeitenDas folgende Klassendiagramm zeigt die vier am Entwurfsmuster beteiligten Rollen KonkreterErzeuger erbt die abstrakte Fabrikmethode von Erzeuger und implementiert sie so dass sie KonkretesProdukt erzeugt das wiederum Produkt implementiert nbsp Klassendiagramm der am Muster beteiligten Rollen Akteure BearbeitenDas Produkt ist der Basistyp Klasse oder Schnittstelle fur das zu erzeugende Produkt Der Erzeuger deklariert die Fabrikmethode um ein solches Produkt zu erzeugen und kann eine Default Implementierung beinhalten Mitunter wird fur die Fabrikmethode eine Implementierung vorgegeben die ein Standard Produkt erzeugt KonkretesProdukt implementiert die Produkt Schnittstelle Es ist also ein konkreter Subtyp von Produkt KonkreterErzeuger uberschreibt die Fabrikmethode um die ihm entsprechenden konkreten Produkte zu erzeugen z B indem er den Konstruktor einer konkreten Produkt Klasse aufruft Vorteile BearbeitenFabrikmethoden entkoppeln ihre Aufrufer von Implementierungen konkreter Produkt Klassen was insbesondere heisst dass fur die Instanzierung kein new Operator in der aufrufenden Klasse verwendet wird Das ist insbesondere wertvoll wenn sich Software Bibliotheken wahrend der Lebenszeit einer Applikation weiterentwickeln so konnen zu einem spateren Zeitpunkt Instanzen anderer Klassen erzeugt werden ohne dass sich die Applikation andern muss Viele objektorientierte Programmiersprachen schreiben den Namen des Konstruktors vor Demgegenuber kann eine Fabrikmethode in der umfassenderen Bedeutung des Begriffes einen aussagekraftigeren Namen haben und es kann mehrere Fabrikmethoden unterschiedlichen Namens und unterschiedlicher Semantik geben Beispielsweise kann eine Methode Color createFromRGB ein Farbobjekt aus RGB Werten erzeugen eine Methode Color createFromHSV ein Farbobjekt aus HSV Werten Dies liesse sich nur mit zwei Konstruktoren nicht bewerkstelligen da die Methoden die gleiche Signatur haben Nachteile BearbeitenDie Verwendung dieses Erzeugungsmusters lauft auf Unterklassenbildung hinaus Es muss eine eigene Klasse vorhanden sein die die Klassen Methode zur Erzeugung aufnehmen kann Beispiele BearbeitenDiese C 14 Implementierung basiert auf der vor C 98 Implementierung im Buch Entwurfsmuster 1 include lt iostream gt include lt memory gt enum ProduktId MEIN DEIN definiert die Klasse des von der Fabrikmethode erzeugten Objekts class Produkt public virtual void print 0 virtual Produkt default implementiert die Produktschnittstelle class KonkretesProduktMEIN public Produkt public void print std cout lt lt this lt lt this lt lt print MEIN n implementiert die Produktschnittstelle class KonkretesProduktDEIN public Produkt public void print std cout lt lt this lt lt this lt lt print DEIN n deklariert die Fabrikmethode die ein Objekt des Typs Produkt zuruckgibt class Erzeuger public virtual std unique ptr lt Produkt gt erzeuge ProduktId id if ProduktId MEIN id return std make unique lt KonkretesProduktMEIN gt if ProduktId DEIN id return std make unique lt KonkretesProduktDEIN gt Wiederholung fur verbleibende Produkte return nullptr virtual Erzeuger default int main Die unique ptr verhindern Memory Leaks std unique ptr lt Erzeuger gt erzeuger std make unique lt Erzeuger gt std unique ptr lt Produkt gt produkt erzeuger gt erzeuge ProduktId MEIN produkt gt print produkt erzeuger gt erzeuge ProduktId DEIN produkt gt print Die Programmausgabe ist ahnlich zu this 0x1e4ce90 print MEIN this 0x1e4d2c0 print DEIN Diese C 11 Implementierung basiert auf dem vor C 98 Beispielcode im Buch Entwurfsmuster include lt iostream gt enum Richtung Norden Sueden Osten Westen class KartenEintrag public virtual void betrete 0 virtual KartenEintrag default class Raum public KartenEintrag public Raum raumNr 0 Raum int n raumNr n void setSeite Richtung d KartenEintrag ms std cout lt lt Raum setSeite lt lt d lt lt lt lt ms lt lt n virtual void betrete Raum const Raum amp delete Dreierregel Raum amp operator const Raum amp delete private int raumNr class Wand public KartenEintrag public Wand virtual void betrete class Tuer public KartenEintrag public Tuer Raum r1 nullptr Raum r2 nullptr raum1 r1 raum2 r2 virtual void betrete Tuer const Tuer amp delete Dreierregel Tuer amp operator const Tuer amp delete private Raum raum1 Raum raum2 class Labyrinth public void fuegeRaumHinzu Raum r std cout lt lt Labyrinth fuegeRaumHinzu lt lt r lt lt n Raum raumNr int const return nullptr Wenn baueLabyrinth virtuelle Funktionen anstelle von Konstruktoren zum Erzeugen der benotigten Raume Wande und Turen aufruft konnen Sie die Klassen der zu erzeugenden Objekte verandern indem sie eine Unterklasse von LabyrinthSpiel erzeugen und die entsprechenden virtuellen Funktionen uberschreiben Dieser Ansatz ist ein Beispiel fur das Fabrikmethodemuster 131 class LabyrinthSpiel public Labyrinth baueLabyrinth Labyrinth einLabyrinth erzeugeLabyrinth Raum r1 erzeugeRaum 1 Raum r2 erzeugeRaum 2 Tuer dieTuer erzeugeTuer r1 r2 einLabyrinth gt fuegeRaumHinzu r1 einLabyrinth gt fuegeRaumHinzu r2 r1 gt setSeite Norden erzeugeWand r1 gt setSeite Osten dieTuer r1 gt setSeite Sueden erzeugeWand r1 gt setSeite Westen erzeugeWand r2 gt setSeite Norden erzeugeWand r2 gt setSeite Osten erzeugeWand r2 gt setSeite Sueden erzeugeWand r2 gt setSeite Westen dieTuer return einLabyrinth Die Fabrikmethoden virtual Labyrinth erzeugeLabyrinth const return new Labyrinth virtual Raum erzeugeRaum int n const return new Raum n virtual Wand erzeugeWand const return new Wand virtual Tuer erzeugeTuer Raum r1 Raum r2 const return new Tuer r1 r2 virtual LabyrinthSpiel default int main LabyrinthSpiel spiel spiel baueLabyrinth Die Programmausgabe ist ahnlich zu Labyrinth fuegeRaumHinzu 0x2281ed0 Labyrinth fuegeRaumHinzu 0x2281ef0 Raum setSeite 0 0x2282340 Raum setSeite 2 0x2281f10 Raum setSeite 1 0x2282360 Raum setSeite 3 0x2282380 Raum setSeite 0 0x22823a0 Raum setSeite 2 0x22823c0 Raum setSeite 1 0x22823e0 Raum setSeite 3 0x2281f10 Das folgende Beispiel verdeutlicht die Verwendung des GoF Musters in einer Software Bibliothek fur eine Restaurant Software Ein Restaurant Erzeuger liefert Mahlzeiten Produkte Das grundsatzliche Verfahren zum Liefern einer Mahlzeit ist immer dasselbe Bestellung aufnehmen Mahlzeit zubereiten Mahlzeit servieren Das lasst sich alles schon in der Klasse Restaurant implementieren bis auf das Zubereiten der Mahlzeit Das Zubereiten Erzeugen ist abhangig von der Art des Restaurants Eine Pizzeria konkreter Erzeuger erzeugt Pizzen konkrete Produkte eine Rostwurstbude erzeugt Rostwurste Die Klasse Restaurant implementiert hierzu eine Methode MahlzeitLiefern die die Mahlzeit liefert eingeschlossen des Bestell und Serviervorgangs Sie benutzt eine abstrakte Methode MahlzeitZubereiten die die fur das konkrete Restaurant konkrete Mahlzeit zubereitet erzeugt MahlzeitZubereiten ist die Fabrik Methode und muss fur jedes konkrete Restaurant entsprechend implementiert werden Diese Software Bibliothek kann fur eine neue Art von Restaurant mit einem eigenen Mahlzeitangebot genutzt werden Von Mahlzeit und von Restaurant muss jeweils eine neue Klasse abgeleitet werden wobei die von Restaurant abgeleitete Klasse in ihrer Methode MahlzeitZubereiten die in diesem Restaurant angebotene Mahlzeit zubereiten erzeugen muss include lt iostream gt include lt string gt include lt memory gt Produkt class Mahlzeit konkretes Produkt class Pizza public Mahlzeit public Pizza std cout lt lt Pizza gebacken lt lt std endl noch ein konkretes Produkt class Rostwurst public Mahlzeit public Rostwurst const std string amp beilage std cout lt lt Rostwurst gebraten lt lt std endl if beilage empty std cout lt lt Serviert mit lt lt beilage lt lt std endl Erzeuger class Restaurant protected std shared ptr lt Mahlzeit gt mahlzeit Die abstrakte Factory Methode die von Erzeugern implementiert werden muss virtual void MahlzeitZubereiten 0 virtual void BestellungAufnehmen std cout lt lt Ihre Bestellung bitte lt lt std endl virtual void MahlzeitServieren std cout lt lt Hier Ihre Mahlzeit Guten Appetit lt lt std endl public Diese Methode benutzt die Factory Methode void MahlzeitLiefern BestellungAufnehmen MahlzeitZubereiten Aufruf der Factory Methode MahlzeitServieren konkreter Erzeuger fur konkretes Produkt Pizza class Pizzeria public Restaurant protected Implementierung der abstrakten Methode der Basisklasse virtual void MahlzeitZubereiten mahlzeit std make shared lt Pizza gt konkreter Erzeuger fur konkretes Produkt Rostwurst class Rostwurstbude public Restaurant protected Implementierung der abstrakten Methode der Basisklasse virtual void MahlzeitZubereiten mahlzeit std make shared lt Rostwurst gt Pommes und Ketchup int main Pizzeria daToni daToni MahlzeitLiefern Rostwurstbude brunosImbiss brunosImbiss MahlzeitLiefern Anwendungsfalle BearbeitenDie Fabrikmethode in der GoF Bedeutung wird angewendet wenn eine Klasse die von ihr zu erzeugenden Objekte nicht kennen kann bzw soll oder wenn Unterklassen bestimmen sollen welche Objekte erzeugt werden Typische Anwendungsfalle sind Frameworks und Klassenbibliotheken Bei GRASP stellt die Fabrikmethode eine Losung dar um sich den Zielen der geringen Kopplung und der hohen Kohasion anzunahern Virtuelle Methode in Schnittstelle oder Klasse Bearbeiten Die virtuelle Methode kann sowohl in der Schnittstelle oder in der Klasse z B Fassade definiert sein die auch sonst fur Objekte eines Typs zustandig ist Unterklassen konnen dann spezifische Typen erzeugen Typische Szenarien Erzeugen abhangiger Objekte Bearbeiten Beispiele Java java sql Connection createStatement das erzeugte Statement verweist auf die Connection und lebt in dieser NET System Data IDbConnection CreateCommand das erzeugte IDbCommand verweist auf die Connection und lebt in dieser Oft haben die erzeugten abhangigen Objekte wieder Fabrikmethoden fur davon abhangige Objekte z B hat IDbCommand eine Methode CreateParameter Daher lassen sich Klassen mit solchen Factory Methoden nicht als Factory Klassen mit Hauptverantwortung Object Creation verstehen im Unterschied zur abstrakten Fabrik Erzeugen unabhangiger Objekte uber zentralisierte indizierte Konstruktoren Bearbeiten Eine Methode aus einer Familie von Fabrikmethoden wird mit Hilfe eines Dictionarys uber einen Key aufgerufen Code Snippet mit C delegates statt Unterklassen der Delegate Typ reprasentiert den Erzeuger jede konkrete anonyme Methode jeweils einen KonkretenErzeuger delegate IFoo CreateFoo IContext creationParameter static IDictionary lt Key CreateFoo gt fooFactory new Dictionary lt Key CreateFoo gt Statische Initialisierung fooFactory key1 cp gt new FooForKey1 cp fooFactory key2 cp gt new FooForKey2Or3 new Key2Child cp fooFactory key3 cp gt new FooForKey2Or3 new Key3Child cp Aufruf IFoo newObject fooFactory key someContext Erlaubt ein kompaktes deskriptives Design der Objekterzeugung Gefahr insbesondere wenn z B in C im Dictionary direkt auf Funktionsaufrufe verwiesen wird dass die Factory Objekte mehr Verantwortung ubernehmen Static Factory Method Bearbeiten Einzelne static Methode die ein Objekt eines Typs oder Untertyps zuruckliefert Kein virtual constructor Sinn der Sache Zentraler klassenbasierter Access Point fur Objekterzeugung analog zu new Erfordert manchmal Einfuhrung einer einzelnen Klasse nur als Factory Method Holder Beispiele Java java util Collections singletonMap Java javax xml parsers DocumentBuilderFactory newInstance Verwandte Entwurfsmuster BearbeitenEine abstrakte Fabrik Abstract Factory wird im Allgemeinen mittels Fabrikmethoden realisiert Fabrikmethoden werden typischerweise aus Schablonenmethoden Template Method heraus aufgerufen Fabrikmethoden finden sich oft in Singletons Weblinks BearbeitenFabrikmethode in C englisch Fabrikmethode in Vala deutsch Fabrikmethode in Java und NET englisch Einzelnachweise Bearbeiten Erich Gamma Richard Helm Ralph Johnson John Vlissides Entwurfsmuster 5 Auflage Addison Wesley Bonn 1996 ISBN 3 8273 1862 9 S 133 ff V DEntwurfsmusterErzeugungsmuster Abstrakte Fabrik Erbauer Fabrikmethode Prototyp Singleton Multiton ObjektpoolStrukturmuster Adapter Brucke Decorator Fassade Fliegengewicht Kompositum StellvertreterVerhaltensmuster Beobachter Besucher Interpreter Iterator Kommando Memento Schablonenmethode Strategie Vermittler Zustand Zustandigkeitskette Interceptor Nullobjekt ProtokollstapelMuster fur objektrelationale Abbildung Datentransferobjekt Table Data Gateway Row Data Gateway Active Record Unit of Work Identity Map Lazy Loading Identity Field Dependent Mapping Embedded Value Serialized LOB Inheritance Mapper Metadata Mapping Query Object Command Query Responsibility SegregationNachrichtenubermittlungsmuster Message Command Message Document Message Event Message Request Reply Return Address Correlation Identifier Message Sequence Message Expiration Format Indicator Message Channel Point to Point Channel Publisher Subscriber Channel Datatype Channel Invalid Message Channel Dead Letter Channel Guaranteed Delivery Channel Adapter Messaging Bridge Message Bus Pipes and Filters Message Router Content based Router Message Filter Dynamic Router Recipient List Splitter Aggregator Resequencer Composed Message Processor Scatter Gather Routing Slip Process Manager Message Broker Message Translator Envelope Wrapper Content Enricher Content Filter Claim Check Normalizer Canonical Data Model Message Endpoint Messaging Gateway Messaging Mapper Transactional Client Polling Consumer Event driven Consumer Competing Consumers Message Dispatcher Selective Consumer Durable Subscriber Idempotent Receiver Service Activator Control Bus Detour Wire Tap Message History Message Store Smart Proxy Test Message Channel PurgerAndere Application Controller Business Delegate Data Access Object Dependency Injection Extension Interface Fluent Interface Inversion of Control IoC Lock Model View Controller MVC Model View Presenter MVP Model View Update MVU Model View ViewModel MVVM Page Controller Registry Remote Facade Repository Service Locator Session State Table Module Template View Threadpool Transaction Script Transform View Two Step View Value ObjectSiehe auch Analysemuster Architekturmuster Abgerufen von https de wikipedia org w index php title Fabrikmethode amp oldid 238327234