Fabrikmethode-Muster

Das Fabrikmethode-Muster ist ein objektorientiertes Designmuster, um das Konzept von Fabriken durchzuführen. Wie andere creational Muster befasst es sich mit dem Problem, Gegenstände (Produkte) zu schaffen, ohne die genaue Klasse des Gegenstands anzugeben, der geschaffen wird.

Die Entwicklung eines Gegenstands verlangt häufig, dass komplizierte Prozesse, die nicht passend sind innerhalb eines dichtenden Gegenstands einschließen. Die Entwicklung des Gegenstands kann zu einer bedeutenden Verdoppelung des Codes führen, kann für den dichtenden Gegenstand nicht zugängliche Information verlangen, kann kein genügend Niveau der Abstraktion zur Verfügung stellen, oder kann nicht sonst ein Teil der Sorgen des dichtenden Gegenstands sein. Das Fabrikmethode-Designmuster behandelt diese Probleme durch das Definieren einer getrennten Methode, für die Gegenstände zu schaffen, die Unterklassen dann überreiten können, um den abgeleiteten Typ des Produktes anzugeben, das geschaffen wird.

Einige der in der Entwicklung eines Gegenstands erforderlichen Prozesse schließen Bestimmung ein, die protestieren, um zu schaffen, die Lebenszeit des Gegenstands führend, und spezialisierte Zunahme und Sorgen der Träne unten des Gegenstands führend. Außerhalb des Spielraums von Designmustern kann sich die Begriff-Fabrikmethode auch auf eine Methode einer Fabrik beziehen, deren Hauptzweck Entwicklung von Gegenständen ist.

Definition

Die Essenz des Fabrikmethode-Musters soll eine Schnittstelle "definieren, für einen Gegenstand zu schaffen, aber die Klassen lassen, die die Schnittstelle durchführen, entscheiden der Klasse zu realisieren. Die Fabrikmethode lässt eine Klasse instantiation zu Unterklassen aufschieben."

Allgemeiner Gebrauch

Fabrikmethoden sind in Werkzeugen und Fachwerk üblich, wo Bibliothekscode Gegenstände von Typen schaffen muss, die durch Anwendungen mit dem Fachwerk subklassifiziert werden können.

Parallele Klassenhierarchien verlangen häufig, dass Gegenstände von einer Hierarchie im Stande sind, passende Gegenstände von einem anderen zu schaffen.

Fabrikmethoden werden in der probegefahrenen Entwicklung verwendet, um Klassen zu erlauben, unter dem Test gestellt zu werden. Wenn solch eine Klasse einen anderen Gegenstand schafft, der unter automatisierten Einheitstests nicht gestellt werden kann (vielleicht, kommuniziert es mit einer Produktionsdatenbank, die nicht immer verfügbar ist), dann wird die Entwicklung von Gegenständen in die virtuelle Fabrikmethode in der Klasse gelegt. Für die Prüfung, (eine Unterklasse) wird dann mit der virtuellen Fabrikmethode geschaffen, die überritten ist, um zu schaffen und, ein unechter Gegenstand zurückzukehren. Einheitstests verwenden dann, um die Funktionalität zu prüfen, ohne die Nebenwirkung zu übernehmen, einen echten Gegenstand zu verwenden.

Anwendbarkeit

Das Fabrikmuster kann wenn verwendet werden:

  • Die Entwicklung eines Gegenstands schließt seinen Wiedergebrauch ohne bedeutende Verdoppelung des Codes aus.
  • Die Entwicklung eines Gegenstands verlangt Zugang zur Information oder den Mitteln, die innerhalb der dichtenden Klasse nicht enthalten werden sollten.
  • Das Lebensmanagement der erzeugten Gegenstände muss zentralisiert werden, um ein konsequentes Verhalten innerhalb der Anwendung zu sichern.

Andere Vorteile und Varianten

Obwohl die Motivation hinter dem Fabrikmethode-Muster Unterklassen erlauben soll, der Typ des Gegenstands zu wählen, zu schaffen, gibt es andere Vorteile für das Verwenden von Fabrikmethoden, von denen viele nicht davon abhängen zu subklassifizieren. Deshalb ist es üblich, "Fabrikmethoden" zu definieren, die nicht polymorph sind, um Gegenstände zu schaffen, um diese anderen Vorteile zu gewinnen. Solche Methoden sind häufig statisch.

Beschreibende Namen

Eine Fabrikmethode hat einen verschiedenen Namen. Auf vielen objektorientierten Sprachen müssen Konstrukteure denselben Namen wie die Klasse haben, in der sie sind, der zu Zweideutigkeit führen kann, wenn es mehr als eine Weise gibt, einen Gegenstand zu schaffen (sieh Überbelastung). Fabrikmethoden haben keine solche Einschränkung und können beschreibende Namen haben. Als ein Beispiel, wenn komplexe Zahlen von zwei reellen Zahlen geschaffen werden, können die reellen Zahlen als Kartesianische oder Polarkoordinaten interpretiert werden, aber Verwenden-Fabrikmethoden, die Bedeutung ist klar (die folgenden Beispiele sind in Java und VB.NET):

Klassenkomplex {\

öffentlicher statischer Komplex fromCartesian (doppelt echt, verdoppeln Sie sich imaginär) {\

geben Sie neuen Komplex (echt, imaginär) zurück;

}\

öffentlicher statischer Komplex fromPolar (verdoppeln Modul, doppelten Winkel), {\

geben Sie neuen Komplex (Modul * weil (Winkel), Modul * Sünde (Winkel)) zurück;

}\

privater Komplex (verdoppeln a, verdoppeln b), {\

//...

}\}\

Komplex c = Complex.fromPolar (1, Pi);

</Quelle>

Öffentlicher Klassenkomplex

Öffentliche Geteilte Funktion fromCartesian (echt So Doppelt, imaginär So Doppelt) Wie Komplex

Kehren Sie (Neuer Komplex (echt, imaginär)) zurück

Endfunktion

Öffentliche Geteilte Funktion fromPolar (So Doppeltes Modul, angeln Sie So Doppelt), Wie Komplex

Kehren Sie (Neuer Komplex zurück (Modul * Mathematik. Weil (Winkel), Modul * Mathematik. Sünde (Winkel)))

Endfunktion

Privates U-Boot Neu (So Doppelt, b Wie Doppelt)

'...

EndU-Boot

Endklasse

</Quelle>

Wenn Fabrikmethoden für die Begriffserklärung wie das verwendet werden, wird der Konstrukteur häufig privat gemacht, um Kunden zu zwingen, die Fabrikmethoden zu verwenden.

Encapsulation

Fabrikmethoden fassen die Entwicklung von Gegenständen kurz zusammen.

Das kann nützlich sein, wenn der Entwicklungsprozess zum Beispiel sehr kompliziert ist, wenn er von Einstellungen in Konfigurationsdateien abhängt oder auf dem Benutzer eingibt.

Betrachten Sie als ein Beispiel ein Programm, um Bilddateien zu lesen und Daumennägel von ihnen zu machen.

Das Programm unterstützt verschiedene Bildformate, die durch eine Leser-Klasse für jedes Format vertreten sind:

öffentliche Schnittstelle ImageReader {\

öffentlicher DecodedImage getDecodedImage ;

}\

öffentliche Klasse GifReader führt ImageReader {\durch

öffentlicher DecodedImage getDecodedImage {\

//...

geben Sie decodedImage zurück;

}\}\

öffentliche Klasse JpegReader führt ImageReader {\durch

öffentlicher DecodedImage getDecodedImage {\ //... geben Sie decodedImage zurück; }\}\</Quelle>

Jedes Mal, wenn das Programm ein Image liest, muss es einen Leser des passenden Typs schaffen, der auf etwas Information in der Datei gestützt ist. Diese Logik kann in einer Fabrikmethode kurz zusammengefasst werden:

öffentliche Klasse ImageReaderFactory {\

öffentlicher statischer ImageReader getImageReader (ist InputStream), {\

interne Nummer imageType = determineImageType (ist);

Schalter (imageType) {\

Fall ImageReaderFactory. GIF:

kehren Sie zurück neuer GifReader (ist);

Fall ImageReaderFactory. JPEG:

kehren Sie zurück neuer JpegReader (ist);

//usw.

}\ }\}\</Quelle>

Das Codebruchstück im vorherigen Beispiel verwendet eine Schalter-Behauptung dem Partner mit einem spezifischen Fabrikgegenstand. Wechselweise konnte diese Vereinigung auch durchgeführt werden als, kartografisch darzustellen. Das würde der Schalter-Behauptung erlauben, durch eine assoziative Reihe lookup ersetzt zu werden.

Beispiel-Durchführungen

Java

Ein Irrgarten-Spiel kann in zwei Weisen, ein mit regelmäßigen Zimmern gespielt werden, die nur mit angrenzenden Zimmern, und ein mit magischen Zimmern verbunden werden, die Spielern erlauben, aufs Geratewohl transportiert zu werden (dieses javanische Beispiel ist einem in den Buchdesignmustern ähnlich). Die regelmäßige Spielweise konnte diese Schablone-Methode verwenden:

öffentliche Klasse MazeGame {\

öffentlicher MazeGame {\

Zimmer room1 = makeRoom ;

Zimmer room2 = makeRoom ;

room1.connect (room2);

this.addRoom (room1);

this.addRoom (room2);

}\

geschütztes Zimmer makeRoom {\

geben Sie neuen OrdinaryRoom zurück;

}\}\</Quelle>

Im obengenannten Schnipsel ist der Konstrukteur eine Schablone-Methode, die etwas allgemeine Logik macht. Es bezieht sich auf die Fabrikmethode, die die Entwicklung von solchen Zimmern kurz zusammenfasst, dass andere Zimmer in einer Unterklasse verwendet werden können. Um die andere Spielweise durchzuführen, die magische Zimmer hat, genügt es, um die Methode zu überreiten:

öffentliche Klasse MagicMazeGame erweitert MazeGame {\

@Override

geschütztes Zimmer makeRoom {\

geben Sie neuen MagicRoom zurück;

}\}\</Quelle>

PHP

Klassenfabrik

{\

öffentliche statische Funktion baut ($type)

{\

$class = 'Format'. $type;

wenn (! class_exists ($class)) {\

werfen Sie neue Ausnahme ('Format-Klasse verpassend.');

}\

geben Sie neuen $class zurück;

}\}\

Klasse FormatString {}\

Klasse FormatNumber {}\

versuchen Sie {\

$string = Fabrik:: Bauen Sie ('Schnur');

}\

Fang (Ausnahme-$e) {\

Echo-$e-> getMessage ;

}\versuchen Sie {\

$number = Fabrik:: Bauen Sie ('Zahl');

}\Fang (Ausnahme-$e) {\ Echo-$e-> getMessage ;}\</Quelle>

Beschränkungen

Es gibt drei mit dem Gebrauch der Fabrikmethode vereinigte Beschränkungen. Das erste verbindet mit dem Wiederfactoring vorhandenen Code; die anderen zwei beziehen sich auf das Verlängern einer Klasse.

  • Die erste Beschränkung ist, dass Wiederfactoring eine vorhandene Klasse, um Fabriken zu verwenden, vorhandene Kunden bricht. Zum Beispiel, wenn Klassenkomplex eine Standardklasse war, könnte er zahlreiche Kunden mit dem Code haben wie:

:Once wir begreifen, dass zwei verschiedene Fabriken erforderlich sind, ändern wir die Klasse (zum Code gezeigt früher). Aber da der Konstrukteur jetzt privat ist, kompiliert der vorhandene Kundencode nicht mehr.

  • Die zweite Beschränkung ist, dass da sich das Muster auf das Verwenden eines privaten Konstrukteurs verlässt, kann die Klasse nicht erweitert werden. Jede Unterklasse muss den geerbten Konstrukteur anrufen, aber das kann nicht getan werden, wenn dieser Konstrukteur privat ist.
  • Die dritte Beschränkung ist, dass, wenn wir wirklich die Klasse erweitern (z.B durch das Bilden des Konstrukteurs geschützt — ist das unsicher, aber ausführbar), die Unterklasse seine eigene Wiederdurchführung aller Fabrikmethoden mit genau denselben Unterschriften zur Verfügung stellen muss. Zum Beispiel, wenn Klasse StrangeComplex erweitert Komplex, dann wenn StrangeComplex seine eigene Version aller Fabrikmethoden, der Anruf nicht zur Verfügung stellt, wird StrangeComplex.fromPolar (1, Pi) ein Beispiel des Komplexes (die Superklasse) aber nicht das erwartete Beispiel der Unterklasse nachgeben. Die Nachdenken-Eigenschaften von einigen Sprachen können dieses Problem begegnen.

Alle drei Probleme konnten durch das Ändern der zu Grunde liegenden Programmiersprache erleichtert werden, um Fabriken erstklassige Klassenmitglieder zu machen (sieh auch Virtuelle Klasse).

Gebrauch

  • In ADO.NET, IDbCommand. CreateParameter ist ein Beispiel des Gebrauches der Fabrikmethode, parallele Klassenhierarchien zu verbinden.
  • In Qt, QMainWindow:: CreatePopupMenu ist eine Fabrikmethode, die in einem Fachwerk erklärt ist, das im Anwendungscode überritten werden kann.
  • In Java werden mehrere Fabriken im javax.xml.parsers Paket verwendet. z.B javax.xml.parsers. DocumentBuilderFactory oder javax.xml.parsers. SAXParserFactory.

Siehe auch

  • Designmuster, das hoch einflussreiche Buch
  • Designmuster, Übersicht von Designmustern in allgemeinem
  • Abstraktes Fabrikmuster, ein Muster hat häufig das Verwenden von Fabrikmethoden durchgeführt
  • Baumeister-Muster, ein anderes creational Muster
  • Schablone-Methode-Muster, das Fabrikmethoden nennen kann

Links


Baumeister-Muster / Prototyp-Muster
Impressum & Datenschutz