El Patrón de Diseño del Método de fábrica en Python

Introducción

En este artículo, analizaremos el Patrón de Diseño del Método de fábrica, implementado en Python.

Los patrones de diseño definen soluciones probadas para diversos problemas recurrentes en el desarrollo de software. No representan código real, sino formas en las que podemos organizar nuestro código para obtener resultados óptimos.

En un mundo de recursos limitados, los patrones de diseño nos ayudan a lograr la mayor cantidad de resultados con la menor cantidad de recursos utilizados. También es importante tener en cuenta que los patrones de diseño no se aplican a todas las situaciones y es crucial evaluar el problema en cuestión para elegir el mejor enfoque para ese escenario en particular.

Los patrones de diseño se dividen en algunas categorías amplias, aunque principalmente en Patrones de Creación, Patrones Estructurales y Patrones de Comportamiento.

El patrón de Método de Fábrica es un Patrón de Diseño Creativo.

El Patrón de diseño del método de fábrica

Definición

El método de fábrica se utiliza en la programación orientada a objetos como medio para proporcionar interfaces de fábrica para crear objetos. Estas interfaces definen la estructura genérica, pero no inicializar objetos. La inicialización se deja a subclases más específicas.

La clase/interfaz padre alberga todo el comportamiento estándar y genérico que se puede compartir entre subclases de diferentes tipos. La subclase es a su vez responsable de la definición e instanciación del objeto basado en la superclase.

Motivación

La principal motivación detrás del Patrón de diseño del Método de fábrica es mejorar el acoplamiento suelto en el código a través de la creación de una clase abstracta que se utilizará para crear diferentes tipos de objetos que comparten algunos atributos y funcionalidades comunes.

Esto da como resultado una mayor flexibilidad y reutilización del código porque la funcionalidad compartida no se reescribirá al haber sido heredada de la misma clase. Este patrón de diseño también se conoce como Constructor Virtual.

El patrón de diseño del método de fábrica se usa comúnmente en bibliotecas al permitir a los clientes elegir qué subclase o tipo de objeto crear a través de una clase abstracta.

Un método de fábrica recibirá información sobre un objeto requerido, lo instanciará y devolverá el objeto del tipo especificado. Esto le da a nuestra aplicación o biblioteca un único punto de interacción con otros programas o piezas de código, encapsulando así nuestra funcionalidad de creación de objetos.

Implementación del método de fábrica

Nuestro programa será una biblioteca utilizada para manejar objetos de forma en términos de creación y otras operaciones, como agregar color y calcular el área de la forma.

Los usuarios deben poder usar nuestra biblioteca para crear nuevos objetos. Podemos comenzar creando formas individuales individuales y aprovecharlas tal cual, pero eso significaría que se tendrá que reescribir una gran cantidad de lógica compartida para todas y cada una de las formas que tenemos disponibles.

El primer paso para resolver esta repetición sería crear una clase de forma principal que tenga métodos como calculate_area() y calculate_perimeter(), y propiedades como dimensiones.

Los objetos de forma específicos heredarán de nuestra clase base. Para crear una forma, necesitaremos identificar qué tipo de forma se requiere y crear la subclase para ella.

Comenzaremos creando una clase abstracta para representar una forma genérica:

Esta es la clase base para todas nuestras formas. Vamos a seguir adelante y crear varias formas concretas y más específicas:

Hasta ahora, hemos creado una clase abstracta y la hemos ampliado para adaptarse a diferentes formas que estarán disponibles en nuestra biblioteca. Para crear los diferentes objetos de forma, los clientes tendrán que conocer los nombres y detalles de nuestras formas y realizar la creación por separado.

Aquí es donde entra en juego el Método de fábrica.

El patrón de diseño del método de fábrica nos ayudará a abstraer las formas disponibles del cliente, es decir, el cliente no tiene que conocer todas las formas disponibles, sino que solo crea lo que necesita durante el tiempo de ejecución. También nos permitirá centralizar y encapsular la creación de objetos.

Consigamos esto creando un ShapeFactory que se utilizará para crear las clases de formas específicas basadas en la entrada del cliente:

Esta es nuestra interfaz para la creación. No llamamos a los constructores de clases de hormigón, llamamos a la fábrica y le pedimos que cree una forma.

Nuestro ShapeFactory funciona al recibir información sobre una forma, como un nombre y las dimensiones requeridas. Nuestro método de fábrica create_shape() se utilizará para crear y devolver objetos listos de las formas deseadas.

El cliente no tiene que saber nada sobre la creación de objetos o detalles específicos. Usando el objeto factory, pueden crear objetos con un conocimiento mínimo de cómo funcionan:

Ejecutar este código resultará en:

O, podríamos construir otra forma:

Lo que vale la pena señalar es que además de que el cliente no tiene que saber mucho sobre el proceso de creación, cuando queremos crear una instancia de un objeto, no llamamos al constructor de la clase. Pedimos a la fábrica que haga esto por nosotros en función de la información que pasamos a la función create_shape().

Pros y contras

Pros

Una de las principales ventajas de usar el patrón de diseño del método de fábrica es que nuestro código se acopla libremente, ya que la mayoría de los componentes de nuestro código desconocen otros componentes de la misma base de código.

Esto da como resultado un código que es fácil de entender y probar y agrega más funcionalidad a componentes específicos sin afectar o romper todo el programa.

El patrón de diseño del Método de fábrica también ayuda a mantener el Principio de Responsabilidad Única donde las clases y los objetos que manejan una funcionalidad específica dan como resultado un mejor código.

Cons

La creación de más clases eventualmente conduce a una menor legibilidad. Si se combina con una Fábrica Abstracta (fábrica de fábricas), el código pronto se volverá detallado, aunque, mantenible.

Conclusión

En conclusión, el Patrón de diseño del Método de fábrica nos permite crear objetos sin especificar la clase exacta requerida para crear el objeto en particular. Esto nos permite desacoplar nuestro código y mejorar su reutilización.

Es importante tener en cuenta que, al igual que cualquier otro patrón de diseño, solo es adecuado para situaciones específicas y no para todos los escenarios de desarrollo. Una evaluación de la situación en cuestión es crucial antes de decidir implementar el Patrón de Diseño del Método de Fábrica para cosechar los beneficios del patrón.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.