Definition: Definieren Sie eine Schnittstelle zum Erstellen eines Objekts, lassen Sie die Unterklasse entscheiden, welche Klasse sie instanziieren soll, und die Fabrikmethode verzögert die Instanziierung einer Klasse an ihre Unterklasse.
Typ: Erstellen Sie Klassenmusterklassendiagramm:
Fabrikmethodenmustercode
Schnittstelle iProduct {public void productMethod (); } Class Product implementiert iProduct {public void productMethod () {System.out.println ("Produkt"); }} Schnittstelle ifactory {public iProduct createProduct (); } class Factory implementiert ifactory {public iProduct CreateProduct () {return New Product (); }} public class Client {public static void main (String [] args) {ifactory factory = new Factory (); IProduct produzieren = factory.createProduct (); produc.ProductMethod (); }} Fabrikmodus:
Zunächst müssen wir über das Fabrikmodell sprechen. Die Fabrikmodi sind gemäß dem Grad der Abstraktion in drei Typen unterteilt: einfacher Fabrikmodus (auch als statischer Fabrikmodus bezeichnet), in diesem Artikel beschriebener Fabrikmethodenmodus und abstrakter Fabrikmodus. Der Werksmodus ist ein Modell, das häufig bei der Programmierung verwendet wird. Seine Hauptvorteile sind:
Es kann die Codestruktur klar machen und Änderungen effektiv zusammenfassen. Bei der Programmierung ist die Instanziierung von Produktklassen manchmal komplex und veränderbar. Durch das Fabrikmodell wird die Instanziierung von Produkten eingekapselt, sodass der Anrufer sich nicht um den Instanziierungsprozess des Produkts kümmern muss und sich nur auf die Fabrik verlassen muss, um das gewünschte Produkt zu erhalten.
Blockieren Sie spezifische Produktkategorien vom Anrufer. Wenn Sie den Werksmodus verwenden, kümmert sich der Anrufer nur um die Benutzeroberfläche des Produkts. Bei der spezifischen Implementierung muss der Anrufer überhaupt keine Pflege. Selbst wenn sich die spezifische Implementierung geändert hat, hat sie keinen Einfluss auf den Anrufer.
Kupplung reduzieren. Die Instanziierung von Produktklassen ist normalerweise sehr kompliziert. Es erfordert, sich auf viele Klassen zu verlassen, und diese Klassen müssen dem Anrufer überhaupt nicht bekannt sein. Wenn eine Fabrikmethode verwendet wird, müssen wir nur die Produktklasse instanziieren und dann dem Anrufer zur Verwendung übergeben. Für den Anrufer sind die Klassen, von denen das Produkt abhängt, transparent.
Fabrikmethodenmodus:
Durch das Klassendiagramm des Factory -Methodenmusters können wir sehen, dass das Werksmethodenmuster vier Elemente enthält:
Fabrikschnittstelle. Die Fabrikschnittstelle ist der Kern des Fabrikmethodemusters und wird verwendet, um Produkte direkt mit dem Anrufer bereitzustellen. In der tatsächlichen Programmierung wird eine abstrakte Klasse manchmal als Schnittstelle zur Interaktion mit dem Anrufer verwendet, was im Wesentlichen gleich ist.
Fabrikimplementierung. In der Programmierung bestimmt die Fabrikimplementierung, wie Produkte instanziiert werden können. Dies ist ein Weg, um eine Expansion zu erzielen. Die Anzahl der erforderlichen Produkte beträgt so viele spezifische Fabrikimplementierungen wie es.
Produktschnittstelle. Der Hauptzweck einer Produktschnittstelle besteht darin, die Produktspezifikationen zu definieren, und alle Produktimplementierungen müssen den von der Produktschnittstelle definierten Spezifikationen entsprechen. Produktoberflächen sind das, was die Anrufer am meisten interessieren, und die Vor- und Nachteile von Produktschnittstellendefinitionen bestimmen direkt die Stabilität des Callers -Code. In ähnlicher Weise können Produktoberflächen auch durch abstrakte Klassen ersetzt werden, aber achten Sie darauf, dass sie nicht gegen das Richter -Ersatzprinzip verstoßen.
Produktimplementierung. Die spezifischen Kategorien von Produktschnittstellen bestimmen das spezifische Verhalten des Produkts im Kunden.
Vorteile des Fabrikmethodemodells:
1. gute Verpackung und Reduzierung der Kopplung zwischen Modulen;
2. Produktoberflächen und blockierende Produktkategorien.
3.. Typischer Entkopplungsgerüst. Auf hohen Modulen müssen nur die abstrakte Klasse des Produkts kennen.
V.
Anwendbare Szenarien:
Unabhängig davon, ob es sich um das einfache Fabrikmodell, das Factory -Methodenmodell oder das abstrakte Fabrikmodell handelt, weisen sie ähnliche Eigenschaften auf, sodass auch ihre anwendbaren Szenarien ähnlich sind.
Zunächst kann als Erstellungsklassenmuster das Factory -Methodenmuster verwendet werden, überall überall komplexe Objekte benötigt werden. Eine Sache zu beachten ist, dass komplexe Objekte für die Verwendung des Werksmodus geeignet sind, während einfache Objekte, insbesondere Objekte, die über NEU erstellt werden können, nicht den Werksmodus verwenden müssen. Wenn Sie das Werksmodell verwenden, müssen Sie eine Fabrikklasse einführen, die die Komplexität des Systems erhöht.
Zweitens ist das Werksmodell ein typischer Entkopplungsmodus, und das Dimitter -Gesetz ist im Werksmodell besonders offensichtlich. Wenn der Anrufer Abhängigkeiten hinzufügen muss, um das Produkt selbst zusammenzustellen, kann er in Betracht ziehen, das Werksmodell zu verwenden. Es wird die Kopplung zwischen Objekten erheblich reduzieren.
Da das Werksmodell auf abstrakte Architektur beruht, übergibt es die Aufgabe, das Produkt an die Implementierungsklasse zu vervollständigen, was eine bessere Skalierbarkeit aufweist. Mit anderen Worten, wenn das System skalierbarer sein muss, kann das Werksmodell berücksichtigt werden und verschiedene Produkte können mit unterschiedlichen Implementierungsfabriken zusammengestellt werden.
Typische Anwendungen
Um die Vorteile des Fabrikmodells zu veranschaulichen, gibt es möglicherweise kein geeigneteres Beispiel als das Zusammenbau eines Autos. Das Szenario ist wie folgt: Das Auto besteht aus einem Motor, einem Räder und einem Chassis, und jetzt ist es notwendig, ein Auto zu montieren und dem Anrufer zu übergeben. Wenn der Werksmodus nicht verwendet wird, lautet der Code wie folgt:
Klasse Engine {public void getStyle () {System.out.println ("Dies ist der Motor des Autos"); }} class Underpan {public void getStyle () {System.out.println ("Dies ist das Chassis des Autos"); }} class Wheel {public void getStyle () {System.out.println ("Dies ist der Reifen des Autos"); }} public class Client {public static void main (String [] args) {Engine Engine = new Engine (); Underpan Underpan = New Underpan (); Rad Rad = neues Wheel (); ICAR Car = New Car (Underpan, Rad, Motor); car.show (); }}Es ist ersichtlich, dass der Anrufer auch den Motor, das Chassis und die Reifen und die Komponenten dieser Autos unabhängig vom Anrufer, was ernsthaft gegen das Dimitt -Gesetz verstößt und eine zu hohe Kopplung aufweist. Und es ist sehr ungünstig für die Expansion. Darüber hinaus sind in diesem Beispiel Motor, Chassis und Reifen relativ spezifisch. In den tatsächlichen Anwendungen können die Komponenten dieser Produkte abstrakt sein, und der Anrufer hat keine Ahnung, wie das Produkt zusammengebaut werden soll. Wenn die Fabrikmethode verwendet wird, erscheint die gesamte Architektur viel klarer.
Schnittstelle ifactory {public icar createCar (); } class Factory implementiert ifactory {public icar createCar () {Engine Engine = new Engine (); Underpan Underpan = New Underpan (); Rad Rad = neues Wheel (); ICAR Car = New Car (Underpan, Rad, Motor); Auto zurückkehren; }} public class Client {public static void main (String [] args) {ifactory factory = new Factory (); Icar car = factory.createcar (); car.show (); }}Nach der Verwendung der Fabrikmethode ist der Kopplungsgrad auf der Anrufseite stark reduziert. Und für Fabriken kann es erweitert werden. Wenn Sie in Zukunft andere Autos zusammenstellen möchten, müssen Sie nur eine weitere Werkseinführung hinzufügen. Sowohl Flexibilität als auch Stabilität wurden erheblich verbessert.
PS: Factory -Methodenmodus und einfacher Werksmodus
Das oben erwähnte einfache Fabrikmodell ist dem Factory -Method -Modell sehr ähnlich. Der Kern der Fabrikmethodenklasse ist eine abstrakte Fabrikklasse, während das einfache Fabrikmodell den Kern einer konkreten Klasse legt. Der Unterschied im Factory -Methodenmodell und das einfache Fabrikmodell ist nicht sehr offensichtlich.