Fabrikmuster

Das Fabrikmuster ist eines der am häufigsten verwendeten Entwurfsmuster in Java. Es bietet eine Möglichkeit, Objekte zu erzeugen, wobei der Prozess der Objekterzeugung vom Prozess der Objektverwendung getrennt wird.

Das Fabrikmuster bietet eine Möglichkeit, Objekte zu erzeugen, ohne die konkrete zu erzeugende Klasse anzugeben.

Durch die Verwendung des Fabrikmusters kann die Objekterzeugungslogik in einer Fabrikklasse gekapselt werden, anstatt Objekte direkt im Client-Code zu instanziieren, was die Wartbarkeit und Erweiterbarkeit des Codes verbessert.

Arten von Fabrikmustern

1. Einfaches Fabrikmuster:

  • Das einfache Fabrikmuster ist kein formales Entwurfsmuster, aber es ist die Grundlage des Fabrikmusters. Es verwendet eine einzelne Fabrikklasse, um verschiedene Objekte zu erzeugen, und bestimmt anhand der übergebenen Parameter, welcher Objekttyp erzeugt werden soll.

2. Fabrikmethode-Muster:

  • Das Fabrikmethode-Muster definiert eine Schnittstelle zum Erzeugen von Objekten, überlässt es jedoch den Unterklassen zu entscheiden, welche Klasse instanziiert wird. Es verlagert die Objekterzeugung auf Unterklassen.

3. Abstraktes Fabrikmuster:

  • Das abstrakte Fabrikmuster bietet eine Schnittstelle zum Erzeugen einer Familie zusammengehöriger oder voneinander abhängiger Objekte, ohne deren konkrete Klassen anzugeben.

summary

Absicht

Definiere eine Schnittstelle zum Erstellen von Objekten und lass Unterklassen entscheiden, welche konkrete Klasse instanziiert wird. Das Factory-Muster verlagert den Prozess der Objekterstellung auf Unterklassen.

Hauptsächlich gelöstes Problem

Das Problem der Schnittstellenauswahl.

Wann verwenden

Wenn wir unter verschiedenen Bedingungen unterschiedliche Instanzen erstellen müssen.

Lösung

Indem Unterklassen die Factory-Schnittstelle implementieren, wird ein abstraktes Produkt zurückgegeben.

Schlüsselcode

Der Prozess der Objekterstellung wird in Unterklassen implementiert.

Anwendungsbeispiel

  1. Automobilherstellung: Du brauchst ein Auto; du holst es einfach aus der Fabrik ab, ohne dich um den Herstellungsprozess und die interne Implementierung des Autos kümmern zu müssen.
  2. HibernateBeim Wechsel von Datenbanken musst du nur den Dialect und den Datenbank Driver ändern, um zwischen verschiedenen Datenbanken zu wechseln.

Vorteile

  1. Der Aufrufer muss nur den Namen des Objekts kennen, um es zu erstellen.
  2. Hohe Erweiterbarkeit: Wenn ein neues Produkt hinzugefügt werden muss, musst du nur eine Factory-Klasse erweitern.
  3. Die konkrete Implementierung des Produkts ist verborgen; der Aufrufer kümmert sich nur um die Produktschnittstelle.

Nachteile

Jedes Mal, wenn ein Produkt hinzugefügt wird, müssen eine konkrete Klasse und eine entsprechende Factory hinzugefügt werden, wodurch sich die Anzahl der Klassen im System vervielfacht und die Komplexität des Systems sowie die Abhängigkeit von konkreten Klassen zunimmt.

Anwendungsfall

  1. Protokollierung: Protokolle können auf einer lokalen Festplatte, in Systemereignissen, auf entfernten Servern usw. aufgezeichnet werden. Benutzer können wählen, wo die Protokolle aufgezeichnet werden.
  2. Datenbankzugriff: Wenn der Benutzer nicht weiß, welche Datenbank das endgültige System verwenden wird, oder wenn sich die Datenbank ändern kann.
  3. Framework-Design für die Verbindung zu einem Server.: Es ist notwendig, drei Protokolle zu unterstützen: "POP3", "IMAP", "HTTP". Diese drei Protokolle können als Produktklassen verwendet werden, die gemeinsam eine Schnittstelle implementieren.

Hinweise

Das Factory-Muster eignet sich für Szenarien, in denen komplexe Objekte erzeugt werden. Wenn das Objekt relativ einfach ist und mit `new` erstellt werden kann, besteht keine Notwendigkeit, das Factory-Muster zu verwenden. Die Verwendung des Factory-Musters führt eine Fabrikklasse ein und erhöht die Systemkomplexität.

Struktur

Das Factory-Muster umfasst die folgenden Hauptrollen:

  • Abstraktes Produkt: Definiert die gemeinsame Schnittstelle oder abstrakte Klasse des Produkts. Es kann die Elternklasse oder Schnittstelle konkreter Produktklassen sein und die gemeinsamen Methoden von Produktobjekten festlegen.
  • Konkretes Produkt: Implementiert die abstrakte Produktschnittstelle und definiert das spezifische Verhalten und die Eigenschaften eines konkreten Produkts.
  • Abstrakte Fabrik: Deklariert abstrakte Methoden zum Erstellen von Produkten; sie kann eine Schnittstelle oder eine abstrakte Klasse sein. Sie kann mehrere Methoden zum Erstellen verschiedener Produkttypen haben.
  • Konkrete Fabrik: Implementiert die abstrakte Fabrikschnittstelle und ist für das tatsächliche Erstellen konkreter Produktobjekte verantwortlich.

Implementierung

Wir werden eineShapeSchnittstelle und ImplementierungShapeDie Entitätsklasse der Schnittstelle erstellen. Der nächste Schritt ist, die Fabrikklasse zu definieren.ShapeFactory。

FactoryPatternDemoKlassenverwendungShapeFactory, umShapeObjekt zu erhalten. Es wirdShapeFactoryInformationen übergeben (CIRCLE / RECTANGLE / SQUARE), um den Typ des benötigten Objekts zu erhalten.

工厂模式的 UML 图

Schritt 1

eine Schnittstelle erstellen:

Shape.java

public interface Shape { void draw(); }

Schritt 2

Erstellen Sie konkrete Klassen, die die Schnittstelle implementieren.

Rectangle.java

public class Rectangle implements Shape { @Override public void draw() { System.out.println("Innerhalb der Methode Rectangle::draw()."); } }

Square.java

public class Square implements Shape { @Override public void draw() { System.out.println("Innerhalb der Methode Square::draw()."); } }

Circle.java

public class Circle implements Shape { @Override public void draw() { System.out.println("Innerhalb der Methode Circle::draw()."); } }

Schritt 3

Erstellen Sie eine Fabrik, die Objekte von Entitätsklassen basierend auf den angegebenen Informationen generiert.

ShapeFactory.java

public class ShapeFactory { //Verwenden Sie die getShape-Methode, um das Objekt des Formtyps zu erhalten. public Shape getShape(String shapeType){ if(shapeType == null){ return null; } if(shapeType.equalsIgnoreCase("CIRCLE")){ return new Circle(); } else if(shapeType.equalsIgnoreCase("RECTANGLE")){ return new Rectangle(); } else if(shapeType.equalsIgnoreCase("SQUARE")){ return new Square(); } return null; } }

Schritt 4

Verwenden Sie diese Factory, um Objekte von Entitätsklassen durch Übergeben von Typinformationen zu erhalten.

FactoryPatternDemo.java

public class FactoryPatternDemo { public static void main(String[] args) { ShapeFactory shapeFactory = new ShapeFactory(); //Holen Sie das Circle-Objekt ab und rufen Sie seine draw-Methode auf. Shape shape1 = shapeFactory.getShape("CIRCLE"); //Rufe die draw-Methode von Circle auf shape1.draw(); //Hole das Rectangle-Objekt und rufe seine draw-Methode auf. Shape shape2 = shapeFactory.getShape("RECTANGLE"); //Rufe die draw-Methode von Rectangle auf shape2.draw(); //Hole das Square-Objekt und rufe seine draw-Methode auf Shape shape3 = shapeFactory.getShape("SQUARE"); //Rufe die draw-Methode von Square auf shape3.draw(); } }

Schritt 5

Führen Sie das Programm aus, Ausgabeergebnis:

Inside Circle::draw() method.
Inside Rectangle::draw() method.
Inside Square::draw() method.

Weitere verwandte Artikel

Weitere Erweiterungen