Saltar al contenido →

Patrón Factory con Swift

El patrón Factory se emplea cuando hay varias clases o estructuras que implementan un determinado protocolo y necesitamos crear una de ellas en base a uno o varios parámetros.

En nuestro ejemplo vamos a suponer que somos los encargados del programa de Rovers de Exploración en Marte y que nuestra misión es la de construir los Rover en base al tipo de terreno que los científicos quieren explorar.

Para ellos vamos a emplear una fábrica de Rovers imaginaria que hay en Marte, y también vamos a dejar volar nuestra imaginación un poco más y permitiremos al Planeta Rojo tener océano, así que los científicos podrán pedirnos que construyamos tres tipos de Rovers:

  1. Terrestre
  2. Aéreo
  3. Marítimo

Como los científicos no tienen porque saber cómo se construye un Rover, encapsularemos la lógica de construcción en una clase Factory a la que simplemente le dirán el tipo de Rover que necesitan, y es está clase Factory la que se encargará de instanciar el tipo correcto e inicializarlo.

Esta clase Factory oculta los detalles de la implementación de cada uno de los distintos Rover y sólo muestra aquellos que pertencen al protocolo común.

Estructra del modelo

En el patrón Factory interviene tres actores principales:

  1. Las clases o estruturas que queremos crear
  2. El procotolo que sirve como base a esas clases o escruturas
  3. Una clase Factory que encapsula la lógica de creación.

Cuando implementemos nuestro patrón Factory debemos tener algo parecido a esto

Implementando las clases

Definimos un protocolo con las propiedades y funciones comunes a los distintos Rover, de esta manera podemos usarlos de la misma manera sin preocuparnos de la clase a la que pertenecen.

Una vez definido el protocolo escribimos las clases o estructuras que representan los diferentes tipos de Rover. Además, incluimos las propiedades y/o funciones que necesiten para su correcto funcionamiento.

Por ejemplo, cuando se les de la orden de moverse el Rover de tipo aéreo debe compobrar el punto de mayor altura en su ruta para ver si es capaz de sobrevolarlo, mientras que el de tipo terrestre debe comprobar si hay alguna pendiente con un ángulo excesivo que le impida subir.

Implementado el Factory

La convención más extendido dice que el método de creación será una función pública estática por lo que estará disponible en toda la aplicación, siendo así muy fácil su uso.

En el ejemplo la función makeRover(for explore: Exploration) -> Rover es la encargada de la creación de los distintos Rover. El usuario sólo tiene que decirle que tipo de explorción quiere llevar a cabo y la función se encarga del resto

Implementado un Rover

Cada una de las clases o estructuras debe implementar el protocol Rover, además de las propiedades y funciones propias que necesite para poder funcionar.

Vamos a ver como quedaría la estructura AirRover encargada de gestionar los Rover de exploración aérea.

Conclusión.

El patrón Factory es uno de los más fáciles de implementar y mejorará mucho nuestra vida como desarrolladores.

Código completo

Como siempre aquí tenéis este repositorio de GitHub con todo el código del artículo.

Publicado en Patrones de Software Swift