Movatterモバイル変換


[0]ホーム

URL:


Zum Inhalt springen
WikipediaDie freie Enzyklopädie
Suche

Abstrakte Fabrik

aus Wikipedia, der freien Enzyklopädie

Dieabstrakte Fabrik (englischabstract factory,kit) ist einEntwurfsmuster aus dem Bereich derSoftwareentwicklung, das zur Kategorie derErzeugungsmuster (englischcreational patterns) gehört. Es definiert eine Schnittstelle zur Erzeugung einer Familie von Objekten, wobei die konkreten Klassen der zu instanziierenden Objekte nicht näher festgelegt werden.[1] Das Muster ist eines der Entwurfsmuster, die von der sogenanntenViererbande (GoF) publiziert wurden.

Verwendung

[Bearbeiten |Quelltext bearbeiten]

Die abstrakte Fabrik wird angewendet, wenn

  • ein System unabhängig von der Art der Erzeugung seiner Produkte arbeiten soll,
  • ein System mit einer oder mehreren Produktfamilien konfiguriert werden soll,
  • eine Gruppe von Produkten erzeugt und gemeinsam genutzt werden soll oder
  • wenn in einer Klassenbibliothek die Schnittstellen von Produkten ohne deren Implementierung bereitgestellt werden sollen.

Eine typische Anwendung ist die Erstellung einergrafischen Benutzeroberfläche mit unterschiedlichenOberflächenmotiven.

Eine abstrakte Fabrik vereinigt die Verantwortlichkeiten „Zusammenfassung der Objektgenerierung an einer Stelle“ und „Möglichkeit zu abstrakten Konstruktoren“ (siehe auch unten unter „Verwandte Entwurfsmuster“).

UML-Diagramm: Abstrakte Fabrik
UML-Diagramm: Abstrakte Fabrik

Akteure

[Bearbeiten |Quelltext bearbeiten]
AbstrakteFabrik
definiert eine Schnittstelle zur Erzeugung abstrakter Produkte einer Produktfamilie
KonkreteFabrik
erzeugt konkrete Produkte einer Produktfamilie durch Implementierung der Schnittstelle
AbstraktesProdukt
definiert eine Schnittstelle für eine Produktart
KonkretesProdukt
definiert ein konkretes Produkt einer Produktart durch Implementierung der Schnittstelle, wird durch die korrespondierende konkrete Fabrik erzeugt
Klient
verwendet die Schnittstellen der abstrakten Fabrik und der abstrakten Produkte

Vorteile

[Bearbeiten |Quelltext bearbeiten]
  • Der Klient ist von konkreten Klassen isoliert.[2]
  • Der Austausch von Produktfamilien ist auf einfache Art und Weise möglich.

Nachteile

[Bearbeiten |Quelltext bearbeiten]

Neue Produktarten lassen sich schwer hinzufügen, da in allen konkreten Fabriken Änderungen vorzunehmen sind.

Verwendung in der Analyse

[Bearbeiten |Quelltext bearbeiten]

Wegen der gemeinsamen Komplexität der beiden wesentlichen Verantwortungen („Zusammenfassung der Objektgenerierung an einer Stelle“ und „Möglichkeit zu abstrakten Konstruktoren“) ist dieses Entwurfsmuster für die Analyse praktisch irrelevant.

Beispiele

[Bearbeiten |Quelltext bearbeiten]

C++

[Bearbeiten |Quelltext bearbeiten]

Diese C++11 Implementierung basiert auf dem vor C++98 Beispielcode im Buch Entwurfsmuster.

#include<iostream>enumRichtung{Norden,Sueden,Osten,Westen};classKartenEintrag{public:virtualvoidbetrete()=0;virtual~KartenEintrag()=default;};classRaum:publicKartenEintrag{public:Raum():raumNr(0){}Raum(intn):raumNr(n){}voidsetSeite(Richtungd,KartenEintrag*ms){std::cout<<"Raum::setSeite "<<d<<' '<<ms<<'\n';}virtualvoidbetrete(){}Raum(constRaum&)=delete;// DreierregelRaum&operator=(constRaum&)=delete;private:intraumNr;};classWand:publicKartenEintrag{public:Wand(){}virtualvoidbetrete(){}};classTuer:publicKartenEintrag{public:Tuer(Raum*r1=nullptr,Raum*r2=nullptr):raum1(r1),raum2(r2){}virtualvoidbetrete(){}Tuer(constTuer&)=delete;// DreierregelTuer&operator=(constTuer&)=delete;private:Raum*raum1;Raum*raum2;};classLabyrinth{public:voidfuegeRaumHinzu(Raum*r){std::cout<<"Labyrinth::fuegeRaumHinzu "<<r<<'\n';}Raum*raumNr(int)const{returnnullptr;}};classLabyrinthFabrik{public:LabyrinthFabrik()=default;virtual~LabyrinthFabrik()=default;virtualLabyrinth*erzeugeLabyrinth()const{returnnewLabyrinth;}virtualWand*erzeugeWand()const{returnnewWand;}virtualRaum*erzeugeRaum(intn)const{returnnewRaum(n);}virtualTuer*erzeugeTuer(Raum*r1,Raum*r2)const{returnnewTuer(r1,r2);}};// Wenn baueLabyrinth ein Objekt als Parameter erhält, das zum Erzeugen von Räumen, Wänden und Türen verwendet wird, dann können Sie die Klassen von Räumen, Wänden und Türen durch das Hereinreichen verschiedener Parameter verändern. Dies ist ein Beispiel für das Abstrakte-Fabrik-Muster (107).classLabyrinthSpiel{public:Labyrinth*baueLabyrinth(LabyrinthFabrik&fabrik){Labyrinth*einLabyrinth=fabrik.erzeugeLabyrinth();Raum*r1=fabrik.erzeugeRaum(1);Raum*r2=fabrik.erzeugeRaum(2);Tuer*eineTuer=fabrik.erzeugeTuer(r1,r2);einLabyrinth->fuegeRaumHinzu(r1);einLabyrinth->fuegeRaumHinzu(r2);r1->setSeite(Norden,fabrik.erzeugeWand());r1->setSeite(Osten,eineTuer);r1->setSeite(Sueden,fabrik.erzeugeWand());r1->setSeite(Westen,fabrik.erzeugeWand());r2->setSeite(Norden,fabrik.erzeugeWand());r2->setSeite(Osten,fabrik.erzeugeWand());r2->setSeite(Sueden,fabrik.erzeugeWand());r2->setSeite(Westen,eineTuer);returneinLabyrinth;}};intmain(){LabyrinthSpielspiel;LabyrinthFabrikfabrik;spiel.baueLabyrinth(fabrik);}

Die Programmausgabe ist ähnlich zu:

Labyrinth::fuegeRaumHinzu0x18aeed0Labyrinth::fuegeRaumHinzu0x18aeef0Raum::setSeite00x18af340Raum::setSeite20x18aef10Raum::setSeite10x18af360Raum::setSeite30x18af380Raum::setSeite00x18af3a0Raum::setSeite20x18af3c0Raum::setSeite10x18af3e0Raum::setSeite30x18aef10

Es soll eine Spielesammlung per Software entwickelt werden. Die verwendeten Klassen sind dabei

  1. Spielbrett (erstes abstraktes Produkt), auf das Spielfiguren platziert werden können und das beispielsweise eine Methode besitzt, um sich auf dem Bildschirm anzuzeigen. Konkrete, davon abgeleitete Produkte sindSchachbrett,Mühlebrett,Halmabrett etc.
  2. Spielfigur (zweites abstraktes Produkt), die auf ein Spielbrett gesetzt werden kann. Konkrete, davon abgeleitete Produkte sindHütchen,Schachfigur (der Einfachheit halber soll es hier nur einen Typ an Schachfiguren geben),Holzsteinchen etc.
  3. Spielfabrik (abstrakte Fabrik), die Komponenten (Spielbrett, Spielfiguren) eines Gesellschaftsspiels erstellt. Konkrete, davon abgeleitete Fabriken sind beispielsweiseMühlefabrik,Damefabrik,Schachfabrik etc.

Ein Klient (z. B. eine Instanz einer Spieler- oder Spielleiter-Klasse) kann sich von der abstrakten Fabrik Spielfiguren bzw. ein Spielbrett erstellen lassen. Je nachdem, welches konkrete Spiel gespielt wird, liefert beispielsweise

  • die Schachfabrik ein Schachbrett und Schachfiguren,
  • die Damefabrik ebenfalls ein Schachbrett, aber Holzsteinchen,
  • die Mühlefabrik ein Mühlebrett, aber ebenfalls Holzsteinchen.

Programmierbeispiel in PHP

[Bearbeiten |Quelltext bearbeiten]
<?php// abstraktes Produkt AabstractclassSpielbrett{abstractfunctionaufstellen();}// abstraktes Produkt BabstractclassSpielfigur{abstractfunctionbewegen();}// abstrakte FabrikabstractclassSpielfabrik{abstractfunctionSpielbrettErzeugen();abstractfunctionSpielfigurErzeugen();}// konkrete Fabrik 1classDameextendsSpielfabrik{publicfunctionSpielbrettErzeugen(){returnnewSchachbrett();}publicfunctionSpielfigurErzeugen(){returnnewDamestein();}}// konkrete Fabrik 2classSchachextendsSpielfabrik{publicfunctionSpielbrettErzeugen(){returnnewSchachbrett();}publicfunctionSpielfigurErzeugen(){returnnewSchachfigur();}}// konkrete Fabrik 3classMuehleextendsSpielfabrik{publicfunctionSpielbrettErzeugen(){returnnewMuehlebrett();}publicfunctionSpielfigurErzeugen(){returnnewDamestein();}}classSchachbrettextendsSpielbrett{publicfunctionaufstellen(){echo"Schachbrett aufgestellt.".PHP_EOL;}}classMuehlebrettextendsSpielbrett{publicfunctionaufstellen(){echo"Mühle-Brett aufgestellt.".PHP_EOL;}}classDamesteinextendsSpielfigur{publicfunctionbewegen(){echo"Damestein bewegt.".PHP_EOL;}}classSchachfigurextendsSpielfigur{publicfunctionbewegen(){echo"Schachfigur bewegt.".PHP_EOL;}}functiontesteSpiel(Spielfabrik$fabrik){$brett=$fabrik->SpielbrettErzeugen();$figur=$fabrik->SpielfigurErzeugen();$brett->aufstellen();$figur->bewegen();}testeSpiel(newDame());testeSpiel(newMuehle());testeSpiel(newSchach());

Ausgabe:

Schachbrett aufgestellt.Damestein bewegt.Mühle-Brett aufgestellt.Damestein bewegt.Schachbrett aufgestellt.Schachfigur bewegt.

Verwandte Entwurfsmuster

[Bearbeiten |Quelltext bearbeiten]

Die abstrakte Fabrik ist einfach eine mehrfache Anwendung derFabrikmethode. Die abstrakte Fabrik kann daher eine ganze Produktfamilie austauschbar machen, während sich die Fabrikmethode nur auf ein Produkt bezieht.

Soll generell eine zusätzliche Hierarchie von Fabriken zu einer Hierarchie von Produkten vermieden werden, kann das Muster desPrototyps verwendet werden. Bei diesem Muster werden zur Erzeugung neuer Objekte prototypische Instanzen kopiert.

Weblinks

[Bearbeiten |Quelltext bearbeiten]
Commons: Abstrakte Fabrik – Album mit Bildern, Videos und Audiodateien

Einzelnachweise

[Bearbeiten |Quelltext bearbeiten]
  1. Erich Gamma,Richard Helm,Ralph Johnson,John Vlissides:Entwurfsmuster. 5. Auflage.Addison-Wesley, 1996,ISBN 3-8273-1862-9,S. 107. 
  2. Karl Eilebrecht, Gernot Starke:Patterns kompakt. Entwurfsmuster für effektive Software-Entwicklung. 3. Auflage. Spektrum Akademischer Verlag, 2010,ISBN 978-3-8274-2525-6,S. 26,doi:10.1007/978-3-8274-2526-3. 
VD
Entwurfsmuster
Erzeugungsmuster

Abstrakte Fabrik |Erbauer |Fabrikmethode |Prototyp |Singleton |Multiton |Objektpool

Strukturmuster

Adapter |Brücke |Decorator |Fassade |Fliegengewicht |Kompositum |Stellvertreter

Verhaltensmuster

Beobachter |Besucher |Interpreter |Iterator |Kommando |Memento |Schablonenmethode |Strategie |Vermittler |Zustand |Zuständigkeitskette |Interceptor |Nullobjekt |Protokollstapel

Muster fürobjekt-
relationale 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-Segregation

Nachrichten-
übermittlungsmuster
Integrationsarten

File Transfer |Shared Database |Remote Procedure Invocation |Messaging

Nachrichtenaufbau

Message |Command Message |Document Message |Event Message |Request-Reply |Return Address |Correlation Identifier |Message Sequence |Message Expiration |Format Indicator

Endpunkte

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

Kanäle

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

Nachrichtenvermittlung

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

Nachrichtenumwandlung

Message Translator |Envelope Wrapper |Content Enricher |Content Filter |Claim Check |Normalizer |Canonical Data Model

Systemmanagement

Control Bus |Detour |Wire Tap |Message History |Message Store |Smart Proxy |Test Message |Channel Purger

andere

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 Object

Abgerufen von „https://de.wikipedia.org/w/index.php?title=Abstrakte_Fabrik&oldid=233573854
Kategorien:

[8]ページ先頭

©2009-2025 Movatter.jp