• Das Factory-Method-Muster ist ein Erzeugungsmuster, das im JDK sowie in den Spring- und Struts-Frameworks weit verbreitet ist.
  • Das Factory-Method-Muster basiert auf einer "Eingabe" und wird zwischen einer Oberklasse und mehreren Unterklassen angewendet; dieses Muster verlagert die Verantwortung für die Erzeugung von Objekten auf die Fabrikklasse.
  • Lassen Sie uns zunächst lernen, wie man das Factory-Method-Muster in Java anwendet und welche Vorteile es bietet. Darüber hinaus ist das Factory-Method-Muster auch im JDK weit verbreitet.
  • Die Oberklasse kann eine Schnittstelle, eine abstrakte Klasse oder eine Elternklasse sein. In diesem Beispiel erklären wir das Factory-Method-Muster durch Überschreiben der toString()-Methode.

Beispiel

package com.journaldev.design.model; public abstract class Computer { public abstract String getRAM(); public abstract String getHDD(); public abstract String getCPU(); @Override public String toString(){ return "RAM= "+this.getRAM()+", HDD="+this.getHDD()+", CPU="+this.getCPU(); } }

Unterklassen des Fabrik-Entwurfsmusters

Angenommen, die Unterklassen PC und Server implementieren Computer:

Beispiel

package com.journaldev.design.model; public class PC extends Computer { private String ram; private String hdd; private String cpu; public PC(String ram, String hdd, String cpu){ this.ram=ram; this.hdd=hdd; this.cpu=cpu; } @Override public String getRAM() { return this.ram; } @Override public String getHDD() { return this.hdd; } @Override public String getCPU() { return this.cpu; } }

Server implementiert außerdem Computer:

Beispiel

package com.journaldev.design.model; public class Server extends Computer { private String ram; private String hdd; private String cpu; public Server(String ram, String hdd, String cpu){ this.ram=ram; this.hdd=hdd; this.cpu=cpu; } @Override public String getRAM() { return this.ram; } @Override public String getHDD() { return this.hdd; } @Override public String getCPU() { return this.cpu; } }

Factory-Klasse

Nachdem wir nun mehrere Unterklassen und eine Oberklasse haben, können wir die Factory-Klasse erstellen:

Beispiel

package com.journaldev.design.factory; import com.journaldev.design.model.Computer; import com.journaldev.design.model.PC; import com.journaldev.design.model.Server; public class ComputerFactory { public static Computer getComputer(String type, String ram, String hdd, String cpu){ if("PC".equalsIgnoreCase(type)) return new PC(ram, hdd, cpu); else if("Server".equalsIgnoreCase(type)) return new Server(ram, hdd, cpu); return null; } }

Es ist wichtig, darauf hinzuweisen, dass:

  • Die Factory-Klasse kann ein Singleton sein, und getComputer kann statisch sein.
  • getComputer ist eine Methode der Factory-Klasse und gibt unterschiedliche Objekte basierend auf denselben Parametertypen zurück.

Als Nächstes folgt ein einfaches Test-Client-Programm, das die oben genannte Implementierung des Factory-Entwurfsmusters verwendet.

Beispiel

package com.journaldev.design.test; import com.journaldev.design.abstractfactory.PCFactory; import com.journaldev.design.abstractfactory.ServerFactory; import com.journaldev.design.factory.ComputerFactory; import com.journaldev.design.model.Computer; public class TestFactory { public static void main(String[] args) { Computer pc = ComputerFactory.getComputer("pc","2 GB","500 GB","2.4 GHz"); Computer server = ComputerFactory.getComputer("server","16 GB","1 TB","2.9 GHz"); System.out.println("Factory-PC-Konfiguration::"+pc); System.out.println("Factory-Server-Konfiguration::"+server); } }

Ausgabe:

Factory PC Config::RAM= 2 GB, HDD=500 GB, CPU=2.4 GHz
Factory Server Config::RAM= 16 GB, HDD=1 TB, CPU=2.9 GHz

Vorteile des Factory-Entwurfsmusters

  • Die Programmierung gegen eine Schnittstelle verkörpert die Idee der objektorientierten Programmierung.
  • Die Arbeit des Erstellens von Objekten wird auf die Factory-Klasse verlagert.

Beispiele für das Factory-Entwurfsmuster im JDK

  • java.util.Calendar, ResourceBundle und NumberFormat getInstance() verwenden das Factory-Methoden-Muster.
  • valueOf() in Wrapper-Klassen wie Boolean und Integer verwendet ebenfalls das Factory-Methoden-Muster.

Übersetzung: https://www.jianshu.com/p/5d52e9ce7358

Original: https://www.journaldev.com/1392/factory-design-pattern-in-java