Bienvenido al tutorial sobre el patrón de diseño Factory en Java. El patrón Factory es uno de los patrones de diseño creacional y se usa ampliamente en JDK, así como en marcos como Spring y Struts.
Patrón de diseño de fábrica
El patrón de diseño de fábrica se utiliza cuando tenemos una superclase con múltiples subclases y, en función de la entrada, necesitamos devolver una de las subclases. Este patrón se encarga de la instanciación de una clase desde el programa cliente a la clase de fábrica. Primero, aprendamos a implementar un patrón de diseño de fábrica en Java y luego veremos las ventajas del patrón de fábrica. Veremos algunos de los usos del patrón de diseño de fábrica en JDK. Tenga en cuenta que este patrón también se conoce como Patrón de diseño de método de fábrica .
Patrón de diseño de fábrica de clase superior
La superclase en el patrón de diseño de fábrica puede ser una interfaz, una clase abstracta o una clase Java normal. Para nuestro ejemplo de patrón de diseño de fábrica, tenemos una superclase abstracta con un método anulado toString() para fines de prueba.
package com.journaldev.design.model;public abstract class Computer {public abstract String getRAM();public abstract String getHDD();public abstract String getCPU();@Overridepublic String toString(){return "RAM= "+this.getRAM()+", HDD="+this.getHDD()+", CPU="+this.getCPU();}}
Subclases del patrón de diseño de fábrica
Digamos que tenemos dos subclases PC y Servidor con la siguiente implementación.
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;}@Overridepublic String getRAM() {return this.ram;}@Overridepublic String getHDD() {return this.hdd;}@Overridepublic String getCPU() {return this.cpu;}}
Tenga en cuenta que ambas clases extienden Computerla superclase.
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;}@Overridepublic String getRAM() {return this.ram;}@Overridepublic String getHDD() {return this.hdd;}@Overridepublic String getCPU() {return this.cpu;}}
Clase de fábrica
Ahora que tenemos listas las superclases y subclases, podemos escribir nuestra clase de fábrica. Aquí está la implementación básica.
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;}}
Algunos puntos importantes sobre el método de patrón de diseño de fábrica son:
- Podemos mantener la clase Factory Singleton o podemos mantener el método que devuelve la subclase como estático .
- Tenga en cuenta que, en función del parámetro de entrada, se crea y se devuelve una subclase diferente.
getComputeres el método de fábrica.
A continuación se muestra un programa de cliente de prueba simple que utiliza la implementación del patrón de diseño de fábrica anterior.
package com.journaldev.design.test;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);}}
La salida del programa anterior es:
Factory PC Config::RAM= 2 GB, HDD=500 GB, CPU=2.4 GHzFactory Server Config::RAM= 16 GB, HDD=1 TB, CPU=2.9 GHz
Ventajas del patrón de diseño de fábrica
- El patrón de diseño de fábrica proporciona un enfoque hacia el código para la interfaz en lugar de la implementación.
- El patrón Factory elimina la instanciación de clases de implementación reales del código del cliente. El patrón Factory hace que nuestro código sea más robusto, menos acoplado y fácil de extender. Por ejemplo, podemos cambiar fácilmente la implementación de la clase de PC porque el programa del cliente no lo sabe.
- El patrón de fábrica proporciona abstracción entre la implementación y las clases cliente a través de la herencia.
Ejemplos de patrones de diseño de fábrica en JDK
- Los métodos java.util.Calendar, ResourceBundle y NumberFormat
getInstance()utilizan el patrón Factory. valueOf()método en clases contenedoras como Boolean, Integer, etc.
Videotutorial de YouTube sobre el patrón de diseño de fábrica
Recientemente subí un video a YouTube sobre el patrón Factory Design. Échale un vistazo. Dale me gusta y comparte el video y suscríbete a mi canal de YouTube. https://www.youtube.com/watch?v=J1QU_R4MQQc
Puedes descargar el código de ejemplo desde mi Proyecto GitHub .