Fabrikmethodenmodus
Die Motivation, ein Objekt zu erstellen, erfordert häufig einen komplexen Prozess, daher ist es nicht für die Aufnahme in eine zusammengesetzte Fabrik geeignet. Wenn es neue Produkte gibt, muss die Verbundfabrik modifiziert werden, was der Expansion nicht förderlich ist.
Darüber hinaus kann die Erstellung einiger Objekte Informationen erfordern, auf die von der Verbundfabrik nicht zugegriffen werden kann. Definieren Sie daher eine Fabrikschnittstelle und bestimmen Sie, welches Produkt durch die Implementierung dieser Schnittstelle instanziiert wird. Dies ist das Fabrikmethodenmuster, das die Instanziierung der Klasse an die Unterklasse verzögert.
Zweck
1. Definieren Sie eine Schnittstelle und lassen Sie die Unterklasse entscheiden, welches Produkt sie instanziieren sollen.
2. Erstellen Sie Objekte über eine gemeinsame Schnittstelle.
erreichen
1. Die Produktschnittstelle und bestimmte Produkte sind leicht zu verstehen.
2. Die Fabrikklasse bietet eine Fabrikmethode, die ein Produktobjekt zurückgibt. Diese Fabrikmethode ist jedoch abstrakt.
3. Implementieren Sie Fabrikmethoden in bestimmten Fabriken und vervollständigen Sie die Erstellung spezifischer Produkte.
// Mehrere Schaltflächenklassenklassenklassen -Schaltflächen {/* ...*/} Klasse WinButton erweitert die Schaltfläche {/* ...*/} Klasse MacButton erweitert die Schaltfläche {/* ...*/} // ihre Fabrikklassen Schnittstellen -Schnittstelle ButtonFactory {Abstract -Schaltfläche CreateButton (); } class WinButtonFactory implementiert ButtonFactory {button createButton () {return New WinButton (); }} Klasse macbuttonFactory implementiert buttonFactory {button createButton () {return New MacButton (); }} Anwendbare Szenarien
1. Wenn beim Erstellen eines Objekts mehr doppelte Code vorhanden ist, können Sie das Factory -Methodenmuster verwenden, um diese doppelten Teile auszuführen.
2. Erstellen eines Objekts erfordert Zugriff auf bestimmte Informationen, die nicht in der Fabrikklasse aufgenommen werden sollten. Anschließend können Unterklassen die Erstellung des Objekts implementieren.
3. Wenn Sie die Erstellung von Objekten zentral verwalten müssen, um die Konsistenz des Programms aufrechtzuerhalten.
Abstraktes Fabrikmuster
Das Definieren abstrakter Fabrikmuster bietet eine Möglichkeit, eine Reihe separater Fabriken mit demselben Thema zu verkörpern. Bei normaler Verwendung muss das Client -Programm eine konkrete Implementierung der abstrakten Fabrik erstellen und dann die abstrakte Fabrik als Schnittstelle verwenden, um ein konkretes Objekt für dieses Thema zu erstellen. Das Client -Programm muss nicht wissen (oder sorgen), dass die spezifische Art von Objekten aus diesen internen Fabrikmethoden abgerufen wird, da das Client -Programm nur die gemeinsame Schnittstelle dieser Objekte verwendet. Das abstrakte Fabrikmuster trennt die Implementierungsdetails einer Reihe von Objekten von ihrer allgemeinen Verwendung.
In einer "Fabrik" werden Produkte (Objekte) erstellt, und sein Ziel ist es, die Schaffung von Produkten von ihrer Verwendung zu trennen. Der Zweck des abstrakten Fabrikmodells besteht darin, die Schnittstellen mehrerer abstrakter Produkte von der spezifischen Implementierung verschiedener Themenprodukte zu trennen. Auf diese Weise müssen Sie beim Hinzufügen einer neuen spezifischen Fabrik den Client -Code, der auf die abstrakte Fabrik verweist, nicht ändern.
Mithilfe des abstrakten Werksmusters können Sie die spezifische Fabrik ändern, ohne den Client -Code mithilfe der Fabrik zu ändern, auch zur Laufzeit. Die Verwendung dieses Musters oder ähnlichen Entwurfsmuster kann jedoch unnötige Komplexität und zusätzliche Arbeit zum Schreiben von Code bringen. Die ordnungsgemäße Verwendung von Entwurfsmustern kann solche "zusätzlichen Arbeit" ausgleichen.
erreichen
1.. AbstractFactory - Definiert die Schnittstellenmethode zum Erstellen abstrakter Produkte.
2. Concretefactory - Implementieren Sie die Methode, um bestimmte Produkte zu erstellen.
3.. AbstractProduct - Eine Schnittstelle, die verschiedene Arten von Produkten deklariert.
4. Produkt - Definieren Sie die spezifischen Produkte, die konkretfaktorisch entsprechen, und implementieren Sie die AbstractProduct -Schnittstelle.
5. Client - Verwenden Sie AbstractFactory- und AbstractProduct -Klassen.
Abstract Class AbstractProducta {public abstract void operationa1 (); öffentliche abstrakte void operationa2 (); } class Producta1 erweitert AbstractProducta {producta1 (String arg) {System.out.println ("Hallo"+arg); } // den Code hier implementieren public void operationa1 () {}; public void operationa2 () {}; } class Producta2 erweitert AbstractProducta {producta2 (String arg) {System.out.println ("Hallo"+arg); } // den Code hier implementieren public void operationa1 () {}; public void operationa2 () {}; } Abstract Class AbstractProductb {// public abstract void operationB1 (); // öffentlich abstrakte void operationb2 (); } class ProductB1 erweitert AbstractProductB {productB1 (string arg) {System.out.println ("Hallo"+arg); } // Implementieren Sie den Code hier} class ProductB2 erweitert AbstractProductB {productB2 (String arg) {System.out.println ("Hallo"+arg); } // den Code hier implementieren} Abstract Class AbstractFactory {Abstract AbstractProducta createProducta (); Abstract AbstractProductB CreateProductb (); } class concretefactory1 erweitert AbstractFactory {AbstractProducta createProducta () {return New Producta1 ("producta1"); } AbstractProductB createProductB () {neuer productB1 ("productB1"); }} class concretefactory2 erweitert AbstractFactory {AbstractProducta createProducta () {return New Producta2 ("producta2"); } AbstractProductB createProductb () {neu produktb2 ("productB2"); }} // Factory Creator - Eine indirekte Methode zur Instanziierung der Fabrikklassen FactoryMaker {private statische AbstractFactory pf = null; static abstractFactory getFactory (String Choice) {if (choice.equals ("a") {pf = new concretefactory1 (); } else if (choice.equals ("b")) {Pf = new concretefactory2 (); } return pf; }} // Client public Class Client {public static void main (String args []) {AbstractFactory pf = factoryMaker.getFactory ("a"); AbstractProducta -Produkt = Pf.CreateProducta (); // Weitere Funktionsaufrufe auf Produkt}}Die FactoryMaker -Klasse verwendet den einfachen Werksmodus, während die Implementierung bestimmter Fabriken den Werksmethodenmodus verwendet.
Anwendbare Szenarien
1. Ein System ist unabhängig von der Erstellung, Zusammensetzung und Darstellung seiner Produkte.
2. Wenn ein System von einer von mehreren Produktfamilien konfiguriert wird.
3.. Es ist notwendig, das Design einer Reihe verwandter Produktobjekte für den gemeinsamen Gebrauch hervorzuheben.
4. Stellen Sie eine Produktbibliothek an und möchten nur ihre Schnittstellen anstelle von Implementierungen anzeigen.
Vorteil
1. Spezifische Produkte werden vom Kundencode getrennt
2. Eine Serie, die sich leicht ändern kann
3. Erstellen Sie zusammen eine Reihe von Produktfamilien zusammen
Mangel
1. Es ist schwierig, neue Produkte in der Produktfamilie zu erweitern. Es erfordert die Änderung der Schnittstellen der abstrakten Fabrik und der spezifischen Fabrik.