• El patrón de método de fábrica es un patrón para crear objetos; se aplica ampliamente en el JDK y en los frameworks Spring y Struts.
  • El patrón de método de fábrica se basa en la "entrada" y se aplica en situaciones entre una superclase y múltiples subclases; este patrón transfiere la responsabilidad de crear objetos a la clase de fábrica.
  • Primero aprendamos cómo aplicar el patrón de método de fábrica en Java y conozcamos las ventajas del método de fábrica; además, el patrón de método de fábrica también se usa ampliamente en el JDK.
  • La superclase puede ser una interfaz, una clase abstracta o una clase padre; en este ejemplo se explicará el patrón de método de fábrica sobrescribiendo el método toString().

Ejemplo

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(); } }

Subclases del patrón de diseño de fábrica

Supongamos que las subclases PC y Server implementan Computer:

Ejemplo

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 también implementa Computer:

Ejemplo

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; } }

Clase de fábrica

Ahora que tenemos varias subclases y una superclase, podemos crear la clase de fábrica:

Ejemplo

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 importante señalar:

  • La clase de fábrica puede ser un singleton; getComputer puede ser estático.
  • getComputer es un método de la clase de fábrica y devuelve diferentes objetos según el mismo tipo de parámetro.

A continuación hay un programa cliente de prueba simple que usa la implementación del patrón de diseño de fábrica anterior.

Ejemplo

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 Config::"+pc); System.out.println("Factory Server Config::"+server); } }

Salida:

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

Ventajas del patrón de diseño de fábrica

  • Programación orientada a interfaces, que refleja la idea de la orientación a objetos.
  • Transfiere el trabajo de crear objetos a la clase de fábrica.

Ejemplos del patrón de diseño de fábrica en el JDK

  • java.util.Calendar, ResourceBundle y NumberFormat getInstance() usan el patrón de método de fábrica.
  • valueOf() en las clases envolventes, como Boolean, Integer, también usa el patrón de método de fábrica.

Traducción: https://www.jianshu.com/p/5d52e9ce7358

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