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

Abstract Factory Method es un patrón de Diseño Creacional que le permite producir las familias de objetos relacionados sin especificar sus clases concretas. Usando el método de fábrica abstracta, tenemos las formas más fáciles de producir un tipo similar de muchos objetos. 
Proporciona una forma de encapsular un grupo de fábricas individuales. Básicamente, aquí tratamos de abstraer la creación de los objetos según la lógica, el negocio, la elección de la plataforma, etc.

Problema al que nos enfrentamos sin el método Abstract Factory:

Imagina que quieres unirte a uno de los lotes de élite de GeeksforGeeks . Entonces, irá allí y preguntará sobre los cursos disponibles, su estructura de tarifas, sus horarios y otras cosas importantes. Simplemente mirarán su sistema y le darán toda la información que necesita. ¿Parece sencillo? Piense en los desarrolladores, cómo hacen que el sistema esté tan organizado y cómo su sitio web es tan lubricante.

Los desarrolladores crearán clases únicas para cada curso que contendrán sus propiedades como la estructura de tarifas, los tiempos y otras cosas. Pero , ¿cómo los llamarán y cómo instanciarán sus objetos ?

Aquí surge el problema, supongamos que inicialmente solo hay 3-4 cursos disponibles en GeeksforGeeks , pero luego agregaron 5 cursos nuevos. 
Por lo tanto, tenemos que instanciar manualmente sus objetos, lo que no es bueno según el lado del desarrollador. 

abstract-factory-python

Fábrica abstracta

Representación esquemática de Problemas sin utilizar el Método de Fábrica Abstracta

Nota: El siguiente código está escrito sin usar el método de fábrica abstracta 

Python3

# Python Code for object
# oriented concepts without
# using the Abstract factory
# method in class
 
class DSA:
 
    """ Class for Data Structure and Algorithms """
 
    def price(self):
        return 11000
 
    def __str__(self):
        return "DSA"
 
class STL:
 
    """Class for Standard Template Library"""
 
    def price(self):
        return 8000
 
    def __str__(self):
        return "STL"
 
class SDE:
 
    """Class for Software Development Engineer"""
 
    def price(self):
        return 15000
 
    def __str__(self):
        return 'SDE'
 
# main method
if __name__ == "__main__":
 
    sde = SDE()    # object for SDE class
    dsa = DSA()    # object for DSA class
    stl = STL()    # object for STL class
 
    print(f'Name of the course is {sde} and its price is {sde.price()}')
    print(f'Name of the course is {dsa} and its price is {dsa.price()}')
    print(f'Name of the course is {stl} and its price is {stl.price()}')

Solución usando el Método de Fábrica Abstracta:

Su solución es reemplazar las llamadas directas de construcción de objetos con llamadas al método especial de fábrica abstracta. En realidad, no habrá diferencia en la creación de objetos, pero se llamarán dentro del método de fábrica. 
Ahora crearemos una clase única cuyo nombre es Course_At_GFG que manejará toda la creación de instancias de objetos automáticamente. Ahora, no tenemos que preocuparnos por cuántos cursos estamos agregando después de un tiempo.

solution-abstract-factory-pattern-method

solución usando un patrón de fábrica abstracto

Python3

# Python Code for object
# oriented concepts using
# the abstract factory
# design pattern
 
import random
 
class Course_At_GFG:
 
    """ GeeksforGeeks portal for courses """
 
    def __init__(self, courses_factory = None):
        """course factory is out abstract factory"""
 
        self.course_factory = courses_factory
 
    def show_course(self):
 
        """creates and shows courses using the abstract factory"""
 
        course = self.course_factory()
 
        print(f'We have a course named {course}')
        print(f'its price is {course.Fee()}')
 
 
class DSA:
 
    """Class for Data Structure and Algorithms"""
 
    def Fee(self):
        return 11000
 
    def __str__(self):
        return "DSA"
 
class STL:
 
    """Class for Standard Template Library"""
 
    def Fee(self):
        return 8000
 
    def __str__(self):
        return "STL"
 
class SDE:
 
    """Class for Software Development Engineer"""
 
    def Fee(self):
        return 15000
 
    def __str__(self):
        return 'SDE'
 
def random_course():
 
    """A random class for choosing the course"""
 
    return random.choice([SDE, STL, DSA])()
 
 
if __name__ == "__main__":
 
    course = Course_At_GFG(random_course)
 
    for i in range(5):
        course.show_course()

Diagrama de clase para el método de fábrica abstracto:

Veamos el diagrama de clases considerando el ejemplo de Cursos en GeeksforGeeks. 
Estructura de tarifas de todos los cursos disponibles en GeeksforGeeks 
 

abstract-factory-class-diagram

diagrama de clases para el patrón de fábrica abstracto

Horarios de todos los cursos disponibles en GeeksforGeeks 
 

abstract-factory-class-diagram-2

diagrama de clase 2 patrón de método abstracto

Ventajas de usar el método Abstract Factory:

Este patrón es particularmente útil cuando el cliente no sabe exactamente qué tipo crear. 

  1. Es fácil introducir nuevas variantes de los productos sin romper el código de cliente existente.
  2. Los productos que recibimos de fábrica seguramente son compatibles entre sí.

Desventajas de usar el método Abstract Factory:

  1. Nuestro código simple puede complicarse debido a la existencia de muchas clases.
  2. Terminamos con una gran cantidad de archivos pequeños, es decir, archivos desordenados.

Aplicabilidad:

  1. Más comúnmente, el patrón de método de fábrica abstracto se encuentra en el equipo de estampado de láminas de metal utilizado en la fabricación de automóviles.
  2. Se puede utilizar en un sistema que tiene que procesar informes de diferentes categorías, como informes relacionados con transacciones de entrada, salida e intermedias.

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 *