Es un patrón de diseño creacional que habla de la creación de un objeto. El patrón de diseño de fábrica dice que defina una interfaz (una interfaz Java o una clase abstracta) y deje que las subclases decidan qué objeto instanciar. El método de fábrica en la interfaz permite que una clase difiera la instanciación a una o más subclases concretas. Dado que estos patrones de diseño hablan de la creación de instancias de un objeto, se incluye en la categoría de patrón de diseño creacional. Si notamos el nombre Factory method , eso significa que hay un método que es una fábrica y, en general, las fábricas están involucradas con cosas de creación y aquí con esto se está creando un objeto. Es una de las mejores formas de crear un objeto donde la lógica de creación de objetos está oculta para el cliente. Ahora veamos la implementación.
Implementación:
1. Defina un método de fábrica dentro de una interfaz.
2. Deje que la subclase implemente el método de fábrica anterior y decida qué objeto crear.
En Java, los constructores no son polimórficos, pero al permitir que la subclase cree un objeto, estamos agregando un comportamiento polimórfico a la creación de instancias. En resumen, estamos tratando de lograr el pseudo polimorfismo al permitir que la subclase decida qué crear, por lo que este método Factory también se denomina como
Constructor virtual . Intentemos implementarlo con un problema en tiempo real y algún ejercicio de codificación.
Declaración del problema:
considere que queremos implementar un servicio de notificación a través de correo electrónico, SMS y notificación automática. Intentemos implementar esto con la ayuda del patrón de diseño del método de fábrica. Primero diseñaremos un diagrama de clases UML para esto.
En el diagrama de clases anterior, tenemos una interfaz llamada Notificación , y tres clases concretas están implementando la interfaz de Notificación. Se crea una clase de fábrica NotificationFactory para obtener un objeto de notificación. Pasemos ahora a la codificación.
Crear interfaz de notificación
java
public interface Notification { void notifyUser(); }
Nota: la interfaz anterior también podría crearse como una clase abstracta.
Crear todas las clases de implementación
SMSNotification.java
java
public class SMSNotification implements Notification { @Override public void notifyUser() { // TODO Auto-generated method stub System.out.println("Sending an SMS notification"); } }
EmailNotification.java
java
public class EmailNotification implements Notification { @Override public void notifyUser() { // TODO Auto-generated method stub System.out.println("Sending an e-mail notification"); } }
PushNotification.java
java
public class PushNotification implements Notification { @Override public void notifyUser() { // TODO Auto-generated method stub System.out.println("Sending a push notification"); } }
Cree una clase de fábrica NotificationFactory.java para instanciar una clase concreta.
java
public class NotificationFactory { public Notification createNotification(String channel) { if (channel == null || channel.isEmpty()) return null; switch (channel) { case "SMS": return new SMSNotification(); case "EMAIL": return new EmailNotification(); case "PUSH": return new PushNotification(); default: throw new IllegalArgumentException("Unknown channel "+channel); } } }
Ahora usemos la clase de fábrica para crear y obtener un objeto de clase concreta pasando alguna información.
java
public class NotificationService { public static void main(String[] args) { NotificationFactory notificationFactory = new NotificationFactory(); Notification notification = notificationFactory.createNotification("SMS"); notification.notifyUser(); } }
Output : Sending an SMS notification
Ejemplos en tiempo real
Este patrón de diseño se ha utilizado ampliamente en JDK, como
1. El método getInstance() de java.util.Calendar, NumberFormat y ResourceBundle utiliza un patrón de diseño de método de fábrica.
2. Todas las clases contenedoras como Integer, Boolean, etc., en Java usan este patrón para evaluar los valores usando el método valueOf().
3. java.nio.charset.Charset.forName(), java.sql.DriverManager#getConnection(), java.net.URL.openConnection(), java.lang.Class.newInstance(), java.lang.Class. forName() son algunos de los ejemplos en los que se ha utilizado el patrón de diseño del método de fábrica.
Conclusión
Hasta ahora hemos aprendido qué es el patrón de diseño del método Factory y cómo implementarlo. Creo que ahora tenemos una comprensión justa de la ventaja de este mecanismo de diseño.
Publicación traducida automáticamente
Artículo escrito por asadaliasad y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA