GeeksforGeeks (Español)
Es un patrón de diseño de creación 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 se refieren a la creación de instancias de un objeto, se incluye en la categoría de patrón de diseño de creación. Si notamos el nombre método Factory, 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 al 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 instanciación. En resumen, estamos tratando de lograr un pseudo polimorfismo dejando que la subclase decida qué crear, por lo que este método Factory también se llama 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 por correo electrónico, SMS y notificaciones automáticas. 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
public
interface
Notification {
void
notifyUser();
}
Nota – La interfaz anterior también se puede crear como una clase abstracta.
Crear todas las clases de implementación
SMSNotification.java
public
class
SMSNotification
implements
Notification {
@Override
public
void
notifyUser()
{
System.out.println(
"Sending an SMS notification"
);
}
}
EmailNotification.java
public
class
EmailNotification
implements
Notification {
@Override
public
void
notifyUser()
{
System.out.println(
"Sending an e-mail notification"
);
}
}
PushNotification.java
public
class
PushNotification
implements
Notification {
@Override
public
void
notifyUser()
{
System.out.println(
"Sending a push notification"
);
}
}
Cree una clase de fábrica NotificationFactory.java para instanciar una clase concreta.
Ahora usemos la clase de fábrica para crear y obtener un objeto de clase concreta pasando algo de información.
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 de fábrica y cómo implementarlo. Creo que ahora tenemos una comprensión justa de las ventajas de este mecanismo de diseño.