Método de fábrica: patrones de diseño de Python

Factory Method es un patrón de diseño de creación que permite que una interfaz o una clase creen un objeto, pero permite que las subclases decidan qué clase u objeto instanciar. Usando el método Factory, tenemos las mejores formas de crear un objeto. Aquí, los objetos se crean sin exponer la lógica al cliente y, para crear el nuevo tipo de objeto, el cliente utiliza la misma interfaz común.
 

Problemas que enfrentamos sin Factory Method:

Imagina que tienes tu propia startup que ofrece viajes compartidos en diferentes partes del país. La versión inicial de la aplicación solo ofrece viajes compartidos en dos ruedas, pero a medida que pasa el tiempo, su aplicación se vuelve popular y ahora desea agregar viajes compartidos en tres y cuatro ruedas también. 
¡Es una gran noticia! pero qué pasa con los desarrolladores de software de tu startup. Tienen que cambiar todo el código porque ahora la mayor parte del código está acoplado con la clase Two-Wheeler y los desarrolladores tienen que hacer cambios en todo el código base. 
Después de terminar con todos estos cambios, los desarrolladores terminan con el código desordenado o con la carta de renuncia. 
 

factory-pattern-python

aplicación de localizador

Representación esquemática de problemas sin utilizar el método de fábrica

Entendamos el concepto con un ejemplo más que está relacionado con las traducciones y localización de los diferentes idiomas. 
Supongamos que hemos creado una aplicación cuyo objetivo principal es traducir un idioma a otro y actualmente nuestra aplicación solo funciona con 10 idiomas. Ahora nuestra aplicación se ha vuelto muy popular entre las personas, pero la demanda ha crecido repentinamente para incluir 5 idiomas más. 
¡Es una gran noticia! solo para el propietario no para los desarrolladores. Tienen que cambiar todo el código porque ahora la mayor parte del código está acoplado solo con los lenguajes existentes y es por eso que los desarrolladores tienen que hacer cambios en todo el código base, lo cual es realmente una tarea difícil de hacer.
Veamos el código del problema que podemos enfrentar sin usar el método de fábrica.
 

Nota: El siguiente código se escribe sin usar el método Factory. 

Python3

# Python Code for Object
# Oriented Concepts without
# using Factory method
 
class FrenchLocalizer:
 
    """ it simply returns the french version """
 
    def __init__(self):
 
        self.translations = {"car": "voiture", "bike": "bicyclette",
                             "cycle":"cyclette"}
 
    def localize(self, msg):
 
        """change the message using translations"""
        return self.translations.get(msg, msg)
 
class SpanishLocalizer:
    """it simply returns the spanish version"""
 
    def __init__(self):
 
        self.translations = {"car": "coche", "bike": "bicicleta",
                             "cycle":"ciclo"}
 
    def localize(self, msg):
 
        """change the message using translations"""
        return self.translations.get(msg, msg)
 
class EnglishLocalizer:
    """Simply return the same message"""
 
    def localize(self, msg):
        return msg
 
if __name__ == "__main__":
 
    # main method to call others
    f = FrenchLocalizer()
    e = EnglishLocalizer()
    s = SpanishLocalizer()
 
    # list of strings
    message = ["car", "bike", "cycle"]
 
    for msg in message:
        print(f.localize(msg))
        print(e.localize(msg))
        print(s.localize(msg))

Solución por Método de Fábrica:

Su solución es reemplazar las llamadas directas de construcción de objetos con llamadas al método de fábrica especial. En realidad, no habrá diferencia en la creación de objetos, pero se llamarán dentro del método de fábrica .
Por ejemplo , nuestras clases Two_Wheeler, Three_Wheeler y Four_wheeler deberían implementar la interfaz de viaje compartido que declarará un método llamado ride . Cada clase implementará este método de forma única.
 

python-factory-patter-solution

diagrama_de_la_fábrica_de_soluciones

Ahora comprendamos el método de fábrica con la ayuda de un ejemplo:

Python3

# Python Code for factory method
# it comes under the creational
# Design Pattern
 
class FrenchLocalizer:
 
    """ it simply returns the french version """
 
    def __init__(self):
 
        self.translations = {"car": "voiture", "bike": "bicyclette",
                             "cycle":"cyclette"}
 
    def localize(self, msg):
 
        """change the message using translations"""
        return self.translations.get(msg, msg)
 
class SpanishLocalizer:
    """it simply returns the spanish version"""
 
    def __init__(self):
        self.translations = {"car": "coche", "bike": "bicicleta",
                             "cycle":"ciclo"}
 
    def localize(self, msg):
 
        """change the message using translations"""
        return self.translations.get(msg, msg)
 
class EnglishLocalizer:
    """Simply return the same message"""
 
    def localize(self, msg):
        return msg
 
def Factory(language ="English"):
 
    """Factory Method"""
    localizers = {
        "French": FrenchLocalizer,
        "English": EnglishLocalizer,
        "Spanish": SpanishLocalizer,
    }
 
    return localizers[language]()
 
if __name__ == "__main__":
 
    f = Factory("French")
    e = Factory("English")
    s = Factory("Spanish")
 
    message = ["car", "bike", "cycle"]
 
    for msg in message:
        print(f.localize(msg))
        print(e.localize(msg))
        print(s.localize(msg))

Diagrama de clases para el método de fábrica:

Veamos el diagrama de clases considerando el ejemplo de viajes compartidos. 
 

factory-pattern-class

Factory_pattern_class_diagram

Ventajas de usar el método Factory: 

  1. Podemos agregar fácilmente nuevos tipos de productos sin alterar el código de cliente existente.
  2. En general, se evita el acoplamiento estrecho entre los productos y las clases y objetos creadores.

Desventajas de usar el método Factory:

  1. Para crear un objeto de producto concreto en particular, el cliente podría tener que crear una subclase de la clase creadora.
  2. Terminas con una gran cantidad de archivos pequeños, es decir, desordenando los archivos.
    • En un sistema de gráficos, dependiendo de la entrada del usuario, puede dibujar diferentes formas como rectángulos, cuadrados, círculos, etc. Pero para comodidad tanto de los desarrolladores como del cliente, podemos usar el método de fábrica para crear la instancia dependiendo de la entrada del usuario. Entonces no tenemos que cambiar el código del cliente para agregar una nueva forma.
    • En un sitio de reserva de hotel, podemos reservar un espacio para 1 habitación, 2 habitaciones, 3 habitaciones, etc. Aquí el usuario puede ingresar la cantidad de habitaciones que desea reservar. Usando el método de fábrica, podemos crear una clase de fábrica Any Rooms que nos ayudará a crear la instancia dependiendo de la entrada del usuario. Nuevamente, no tenemos que cambiar el código del cliente para agregar la nueva instalación.

Publicación traducida automáticamente

Artículo escrito por chaudhary_19 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *