Patrón de Fábrica

Sean Bradley
Sean Bradley

Seguir

Apr 9, 2019 · 4 min read

Cuando el desarrollo de código, puede crear instancias de objetos directamente en los métodos o en las clases. Si bien esto es bastante normal, es posible que desee agregar una abstracción adicional entre la creación del objeto y el lugar donde se usa en su proyecto.

Puede usar el patrón de fábrica para agregar esa abstracción adicional. El patrón de fábrica es uno de los patrones más fáciles de entender e implementar.

Agregar una abstracción adicional también le permitirá elegir dinámicamente clases para crear instancias basadas en algún tipo de lógica.

Antes de la abstracción, su clase o método crearía directamente una clase concreta. Después de agregar la abstracción de fábrica, la clase concrete ahora se crea fuera de la clase/método actual, y ahora en una subclase.

Imagine una aplicación para diseñar casas y la casa ya tiene una silla agregada en el suelo por defecto. Al agregar el patrón de fábrica, puede dar la opción al usuario de elegir diferentes sillas y cuántas en tiempo de ejecución. En lugar de que la silla esté codificada en el proyecto cuando se inició, el usuario ahora tiene la opción de elegir.

Agregar esta abstracción adicional también significa que las complicaciones de crear instancias de objetos adicionales ahora se pueden ocultar de la clase o el método que lo está usando.

Esta separación también hace que su código sea más fácil de leer y documentar.

El patrón de fábrica realmente se trata de agregar esa abstracción adicional entre la creación del objeto y el lugar donde se usa. Esto le da opciones adicionales que puede ampliar más fácilmente en el futuro.

  • Concrete Creator: La aplicación, clase o método cliente que llama al Creador (método Factory).
  • Interfaz de producto: La interfaz que describe los atributos y métodos que la fábrica requerirá para crear el producto/objeto final.
  • Creador: La clase de fábrica. Declara el método Factory que devolverá el objeto solicitado.
  • Producto de hormigón: El objeto devuelto de fábrica. El objeto implementa la interfaz del producto.

Diagrama UML de fábrica

Diagrama UML de patrón de fábrica

Código fuente

En este ejemplo de concepto, el cliente desea un objeto llamado b

En lugar de crear b directamente en el cliente, le pide al creador (fábrica) el objeto.

La fábrica encuentra la clase relevante usando algún tipo de lógica de los atributos de la solicitud. Luego le pide a la subclase que instancie el nuevo objeto que luego devuelve como referencia al cliente que lo solicita.

./factory/factory_concept.py

"""
The Factory Pattern Concept
https://sbcode.net/python/factory/#factoryfactory_conceptpy
"""from abc import ABCMeta, abstractmethodclass IProduct(metaclass=ABCMeta):
"A Hypothetical Class Interface (Product)" @staticmethod
@abstractmethod
def create_object():
"An abstract interface method"class ConcreteProductA(IProduct):
"A Concrete Class that implements the IProduct interface" def __init__(self):
self.name = "ConcreteProductA" def create_object(self):
return selfclass ConcreteProductB(IProduct):
"A Concrete Class that implements the IProduct interface" def __init__(self):
self.name = "ConcreteProductB" def create_object(self):
return selfclass ConcreteProductC(IProduct):
"A Concrete Class that implements the IProduct interface" def __init__(self):
self.name = "ConcreteProductC" def create_object(self):
return selfclass Creator:
"The Factory Class" @staticmethod
def create_object(some_property):
"A static method to get a concrete product"
if some_property == 'a':
return ConcreteProductA()
if some_property == 'b':
return ConcreteProductB()
if some_property == 'c':
return ConcreteProductC()
return None# The Client
PRODUCT = Creator().create_object('b')
print(PRODUCT.name)

Salida

python ./factory/factory_concept.py 
ConcreteProductB

Video de descripción general del patrón de fábrica

Ejemplo De Caso De Uso

Visite Patrones De Diseño De Fábrica En Python (sbcode.net) para un ejemplo de caso de uso del patrón de fábrica.

Un caso de uso de ejemplo es una interfaz de usuario donde el usuario puede seleccionar de un menú de elementos, como sillas.

Al usuario se le ha dado una opción usando algún tipo de interfaz de navegación, y se desconoce qué opción, o cuántas hará el usuario hasta que la aplicación se esté ejecutando realmente y el usuario comience a usarla.

Por lo tanto, cuando el usuario selecciona la silla, la fábrica toma alguna propiedad involucrada con esa selección, como un ID, Tipo u otro atributo, y luego decide qué subclase relevante crear una instancia para devolver el objeto apropiado.

Ejemplo del mundo real del Patrón de fábrica que se está utilizando

Vea el gif de arriba para ver un ejemplo muy gráfico de un ejemplo del mundo real de usar el patrón de fábrica para devolver objetos de silla. El panel de la izquierda contiene sillas, y cuando arrastra y suelta una silla al panel de la derecha, llama a la Fábrica de sillas para devolverla una silla.

Video de caso de uso de patrón de fábrica

Resumen

  • El Patrón de fábrica es una Interfaz que aplaza la creación del objeto final a una subclase.
  • El patrón de fábrica consiste en insertar otra capa / abstracción entre la creación de instancias de un objeto y el lugar del código en el que se usa realmente.
  • Se desconoce qué o cuántos objetos se necesitarán crear hasta el tiempo de ejecución.
  • Desea localizar el conocimiento de los detalles de la creación de instancias de un objeto particular en la subclase para que el cliente no tenga que preocuparse por los detalles.
  • Desea crear un marco externo, que una aplicación pueda importar / hacer referencia,y ocultar los detalles de los detalles involucrados en la creación del objeto/producto final.
  • El factor único que define el patrón de fábrica, es que su proyecto ahora aplaza la creación de objetos a la subclase en la que la fábrica lo había delegado.

Patrones de diseño En Python (Libro)

A veces solo desea apagar su computadora y leer desde un libro. Por lo tanto, este patrón, más todos los demás patrones de GoF, se discuten en mis Patrones de diseño en el libro de Python ASIN B08XLJ8Z2J