El método de fábrica es un Patrón de Diseño de Creación que permite que una interfaz o una clase cree un objeto, pero permite que las subclases decidan qué clase u objeto crear una instancia. 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 el Método de fábrica:
Imagine que tiene su propia startup que ofrece viajes compartidos en las diferentes partes del país. La versión inicial de la aplicación solo proporciona el viaje compartido de dos ruedas, pero a medida que pasa el tiempo, su aplicación se vuelve popular y ahora desea agregar el viaje compartido de 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 de Dos ruedas y los desarrolladores tienen que hacer cambios en toda la base de código.
Después de terminar con todos estos cambios, los desarrolladores terminan con el código desordenado o con la carta de renuncia.
Aplicación Localizer
Representación diagramática de problemas sin usar el Método Factory
Entendamos el concepto con un ejemplo más que está relacionado con las traducciones y la localización de los diferentes idiomas.
Supongamos que hemos creado una aplicación cuyo propósito 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 la gente, pero la demanda ha crecido de repente 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 toda la base de código, lo que es realmente una tarea difícil de hacer.
Veamos el código para el 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.
class
FrenchLocalizer:
def
__init__(
self
):
self
.translations
=
{
"car"
:
"voiture"
,
"bike"
:
"bicyclette"
,
"cycle"
:
"cyclette"
}
def
localize(
self
, message):
return
self
.translations.get(msg, msg)
class
SpanishLocalizer:
def
__init__(
self
):
self
.translations
=
{
"car"
:
"coche"
,
"bike"
:
"bicicleta"
,
"cycle"
:
"ciclo"
}
def
localize(
self
, msg):
return
self
.translations.get(msg, msg)
class
EnglishLocalizer:
def
localize(
self
, msg):
return
msg
if
__name__
=
=
"__main__"
:
f
=
FrenchLocalizer()
e
=
EnglishLocalizer()
s
=
SpanishLocalizer()
message
=
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 especial de fábrica. En realidad, no habrá diferencia en la creación de objetos, pero se están llamando dentro del método factory.
Por ejemplo: Nuestras clases Two_Wheeler, Three_Wheeler y Four_wheeler deberían implementar la interfaz de uso compartido de viajes que declarará un método llamado ride. Cada clase implementará este método de forma única.
solution_factory_diagram
Ahora entendamos el método factory con la ayuda de un ejemplo:
class
FrenchLocalizer:
def
__init__(
self
):
self
.translations
=
{
"car"
:
"voiture"
,
"bike"
:
"bicyclette"
,
"cycle"
:
"cyclette"
}
def
localize(
self
, message):
return
self
.translations.get(msg, msg)
class
SpanishLocalizer:
def
__init__(
self
):
self
.translations
=
{
"car"
:
"coche"
,
"bike"
:
"bicicleta"
,
"cycle"
:
"ciclo"
}
def
localize(
self
, msg):
return
self
.translations.get(msg, msg)
class
EnglishLocalizer:
def
localize(
self
, msg):
return
msg
def
Factory(language
=
"English"
):
localizers
=
{
"French"
: FrenchLocalizer,
"English"
: EnglishLocalizer,
"Spanish"
: SpanishLocalizer,
}
return
localizers()
if
__name__
=
=
"__main__"
:
f
=
Factory(
"French"
)
e
=
Factory(
"English"
)
s
=
Factory(
"Spanish"
)
message
=
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 teniendo en cuenta el ejemplo de los viajes compartidos.
Factory_pattern_class_diagrma
Ventajas de usar el método de fábrica:
- Podemos añadir fácilmente los nuevos tipos de productos sin alterar el código de cliente existente.
- Generalmente, se evita el acoplamiento estrecho entre los productos y las clases y objetos creadores.
Desventajas de usar el método de fábrica:
- Para crear un objeto de producto concreto particular, el cliente puede tener que subclasificar la clase creator.
- Se termina con un gran número de archivos pequeños, es decir, el desorden de los archivos.
- En un sistema gráfico, dependiendo de la entrada del usuario, puede dibujar diferentes formas como Rectángulo, Cuadrado, Círculo, etc. Pero para la facilidad tanto de los desarrolladores como del cliente, podemos usar el método factory para crear la instancia dependiendo de la entrada del usuario. Entonces no tenemos que cambiar el código de cliente para agregar una nueva forma.
- En un sitio de reservas de hotel, podemos reservar un espacio para 1 habitación, 2 habitaciones, 3 habitaciones, etc. Aquí el usuario puede introducir el número de habitaciones que desea reservar. Usando el método factory, podemos crear una clase de fábrica AnyRooms que nos ayudará a crear la instancia dependiendo de la entrada del usuario. De nuevo, no tenemos que cambiar el código del cliente para agregar la nueva instalación.
Aplicabilidad :
Leer más: Patrón de fábrica en C++