Factory-Methodenmuster (Factory-Methode)
Das Factory-Methodenmuster ist in drei Typen unterteilt:
1. Der normale Factory-Modus besteht darin, eine Factory-Klasse einzurichten, um Instanzen einiger Klassen zu erstellen, die dieselbe Schnittstelle implementieren. Schauen Sie sich zunächst das Beziehungsdiagramm an:
Zum Beispiel: (Lassen Sie uns ein Beispiel für das Versenden von E-Mails und Textnachrichten geben)
Erstellen Sie zunächst eine gemeinsame Schnittstelle zwischen den beiden:
public interface Sender { public void Send(); }
Zweitens erstellen Sie eine Implementierungsklasse:
public class MailSender implements Sender { @Override public void Send() { System.out.println("this is mailsender!"); } }
public class SmsSender implements Sender { @Override public void Send() { System.out.println("this is sms sender!"); } }
Erstellen Sie schließlich eine Factory-Klasse:
public class SendFactory { public Sender produce(String type) { if ("mail".equals(type)) { return new MailSender(); } else if ("sms".equals(type)) { return new SmsSender(); } else { System.out.println("请输入正确的类型!"); return null; } } }
Testen wir es:
public class FactoryTest { public static void main(String[] args) { SendFactory factory = new SendFactory(); Sender sender = factory.produce("sms"); sender.Send(); } }
Ausgabe:
this is sms sender!
2. Das Methodenmuster mit mehreren Fabriken stellt eine Verbesserung gegenüber dem normalen Fabrikmethodenmuster dar. Wenn die übergebene Zeichenfolge falsch ist, kann das Objekt nicht korrekt erstellt werden, während das Methodenmuster mit mehreren Fabriken mehrere zu erstellende Fabrikmethoden bereitstellt Objekte separat. Beziehungsdiagramm:
Ändern Sie den obigen Code und ändern Sie die SendFactory-Klasse wie folgt:
public class SendFactory { public Sender produceMail(){ return new MailSender(); } public Sender produceSms(){ return new SmsSender(); } }
Die Testklasse lautet wie folgt:
public class FactoryTest { public static void main(String[] args) { SendFactory factory = new SendFactory(); Sender sender = factory.produceMail(); sender.Send(); } }
Ausgabe:
this is mailsender!
3. Statischer Factory-Methodenmodus. Machen Sie die Methoden in den oben genannten mehreren Factory-Methodenmodi. Es ist nicht erforderlich, eine Instanz zu erstellen, sondern sie einfach direkt aufzurufen.
public class SendFactory { public static Sender produceMail(){ return new MailSender(); } public static Sender produceSms(){ return new SmsSender(); } }
public class FactoryTest { public static void main(String[] args) { Sender sender = SendFactory.produceMail(); sender.Send(); } }
Ausgabe:
this is mailsender!
Generell ist das Factory-Muster geeignet: Immer wenn eine große Anzahl von Produkten erstellt werden muss und über eine gemeinsame Schnittstelle verfügt, können diese über das erstellt werden Factory-Methodenmuster. Unter den oben genannten drei Modi kann der erste Modus das Objekt nicht korrekt erstellen, wenn die eingehende Zeichenfolge falsch ist. Der dritte Modus muss die Factory-Klasse im Vergleich zum zweiten Modus nicht instanziieren. Daher werden wir in den meisten Fällen den dritten Modus wählen - statisches Factory-Methodenmuster.
4. Abstraktes Factory-Muster (Abstract Factory)
Ein Problem mit dem Factory-Methodenmuster besteht darin, dass die Erstellung von Klassen von der Factory-Klasse abhängt Im Programm müssen Sie die Factory-Klasse ändern. Änderungen verstoßen gegen das Schließungsprinzip. Aus gestalterischer Sicht gibt es daher bestimmte Probleme. Verwenden Sie einfach das abstrakte Factory-Muster und erstellen Sie mehrere Factory-Klassen. Sobald Sie neue Funktionen hinzufügen müssen, können Sie einfach neue Factory-Klassen direkt hinzufügen, ohne den vorherigen Code zu ändern. Da die abstrakte Fabrik nicht leicht zu verstehen ist, ist es einfacher, sie zu verstehen, wenn wir uns zuerst das Diagramm und dann den Code ansehen.
Siehe Beispiel:
public interface Sender { public void Send(); }
Zwei Implementierungsklassen:
public class MailSender implements Sender { @Override public void Send() { System.out.println("this is mailsender!"); } }
public class SmsSender implements Sender { @Override public void Send() { System.out.println("this is sms sender!"); } }
Zwei Factory-Klassen:
public class SendMailFactory implements Provider { @Override public Sender produce(){ return new MailSender(); } }
public class SendSmsFactory implements Provider{ @Override public Sender produce() { return new SmsSender(); } }
Bereitstellung einer Schnittstelle:
public interface Provider { public Sender produce(); }
Testklasse:
public class Test { public static void main(String[] args) { Provider provider = new SendMailFactory(); Sender sender = provider.produce(); sender.Send(); } }
Tatsächlich besteht der Vorteil dieses Modells darin, dass Sie, wenn Sie eine Funktion hinzufügen möchten: Senden zeitnaher Nachrichten, nur eine Implementierungsklasse erstellen, die Sender-Schnittstelle implementieren und eine erstellen müssen Es ist in Ordnung, die Provider-Schnittstelle gleichzeitig zu implementieren, und es besteht keine Notwendigkeit, den vorhandenen Code zu ändern. Auf diese Weise ist die Skalierbarkeit besser!
php Chinesische Website, eine große Anzahl kostenloser Java-Einführungs-Tutorials, willkommen zum Online-Lernen!
Das obige ist der detaillierte Inhalt vonWas ist ein Fabrikmuster in Java?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!