Desde que se publicara en 1994, se han vendido más de 500 000 copias de Patrones de diseño: elementos de software orientado a objetos re­uti­li­za­bles. Este libro para de­sa­rro­lla­do­res de software describe 23 patrones de diseño, también conocidos en círculos pro­fe­sio­na­les como los patrones de diseño de la Gang of Four, un término que se refiere a los cuatro autores del libro: Erich Gamma, John Vlissides, Ralph Johnson y Richard Helm.

Entre las diversas es­tra­te­gias de diseño expuestas en esta pu­bli­ca­ción, se encuentra el factory method, que permite que una clase delegue en las subclases la creación de objetos. En concreto, es el patrón del factory method, que ac­tua­l­me­n­te suele conocerse si­m­ple­me­n­te como Factory Pattern, el que se utiliza para explicar cómo se usa este práctico método.

¿Qué es el Factory Pattern?

El patrón Factory, o patrón de diseño Método Factoría, describe un enfoque de pro­gra­ma­ción que sirve para crear objetos sin tener que es­pe­ci­fi­car su clase exacta. Esto quiere decir que el objeto creado puede in­te­r­ca­m­biar­se con fle­xi­bi­li­dad y facilidad. Para im­ple­me­n­tar este método, los de­sa­rro­lla­do­res utilizan el Factory Method, que da nombre a este patrón. Su uso puede es­pe­ci­fi­car­se en una interfaz o im­ple­me­n­tar­se mediante la clase hijo o la clase base y op­cio­na­l­me­n­te so­bre­s­cri­bi­r­se (mediante clases derivadas). Al hacerlo, el patrón o método toma el lugar del co­n­s­tru­c­tor de clase normal para separar la creación de objetos de los propios objetos. Como resultado, es posible seguir los pri­n­ci­pios SOLID.

Nota

Los pri­n­ci­pios SOLID son un subgrupo de pri­n­ci­pios del diseño orientado a objetos que pretenden mejorar el proceso de de­sa­rro­llo del software orientado a objetos. El acrónimo SOLID hace re­fe­re­n­cia a los cinco pri­n­ci­pios si­guie­n­tes:

- Single re­s­po­n­si­bi­li­ty principle o principio de re­s­po­n­sa­bi­li­dad única: cada clase debería tener solo una re­s­po­n­sa­bi­li­dad.

- Open/closed principle o principio de abierto/cerrado: las entidades de software deberían ser ex­pa­n­di­bles sin necesidad de cambiar su co­m­po­r­ta­mie­n­to.

- Liskov su­b­s­ti­tu­tion principle o principio de su­s­ti­tu­ción de Liskov: siempre debería uti­li­zar­se la clase derivada en vez de la clase base.

- Interface se­gre­ga­tion principle o principio de se­gre­ga­ción de la interfaz: las in­te­r­fa­ces deberían adaptarse pe­r­fe­c­ta­me­n­te a los re­qui­si­tos de los clientes que acceden.

- Dependency inversion principle o principio de la inversión de la de­pe­n­de­n­cia: las clases que tienen un mayor nivel de ab­s­tra­c­ción nunca deberían depender de las clases con un nivel de ab­s­tra­c­ción menor.

En muchos casos, se usa el término abreviado Factory Pattern (patrón Factory) o Factory Design Pattern (patrón de diseño Factoría) a pesar de que la Gang of Four no lo define así en el libro. De hecho, si exa­mi­na­mos en pro­fu­n­di­dad el libro, veremos que además del Factory Method que co­me­n­ta­mos en este artículo, solo existe el similar patrón Factory abstracto, que define a una interfaz para la creación de una familia de objetos, cuyas clases concretas solo se definen durante el tiempo de ejecución.

¿Cuál es la finalidad del patrón Factory?

El Factory Pattern se propone resolver un problema fu­n­da­me­n­tal de la in­s­ta­n­cia­ción (la creación de un objeto concreto de una clase) en la pro­gra­ma­ción orientada a objetos. En principio, es posible crear un objeto di­re­c­ta­me­n­te en la clase que requiere o en la que debería estar, pero también es muy in­fle­xi­ble. Hacer esto vincula la clase al objeto en cuestión y es imposible cambiar la in­s­ta­n­cia­ción al margen de la clase. Este tipo de código se evita en el patrón Factory de­fi­nie­n­do una operación aparte para crear el objeto: el Método Factoría. En cuanto se llama, este método genera el objeto en vez del co­n­s­tru­c­tor de clase que ya me­n­cio­na­mos.

El patrón de diseño Factory en un diagrama UML

En el software que se basa en el patrón Factory, el código de un objeto a crear (en este contexto también conocido como producto) se ex­te­r­na­li­za a una clase aparte. Esta clase abstracta, también llamada “creador” o, siguiendo el patrón, “factoría”, delega la in­s­ta­n­cia­ción del objeto a una subclase (Co­n­cre­te­Crea­tor), la cual fi­na­l­me­n­te decide qué producto se crea. Con este fin, el Co­n­cre­te­Crea­tor toma el control del método crea­te­Pro­du­ct() y devuelve un Co­n­cre­te­Pro­du­ct, que el creador puede ampliar con código de pro­du­c­ción antes de que pase a la interfaz como producto fi­na­li­za­do.

Abajo arrojamos luz sobre el patrón Factory gracias a un diagrama de clase UML que resume de manera gráfica las re­la­cio­nes y los procesos descritos.

Ventajas e in­co­n­ve­nie­n­tes del patrón de diseño Factory

En el Factory Pattern, la llamada del método de pro­gra­ma­ción va to­ta­l­me­n­te separada de la im­ple­me­n­ta­ción de clases nuevas, algo que tiene sus ventajas. Por ejemplo, esta condición influye pa­r­ti­cu­la­r­me­n­te en cómo puede ex­te­n­de­r­se el software. Las in­s­ta­n­cias Factory cuentan con un alto grado de autonomía, lo cual quiere decir que te permiten añadir clases nuevas sin que la apli­ca­ción tenga que cambiar de ninguna manera, y todo en paralelo al tiempo de ejecución. En este proceso, basta con im­ple­me­n­tar la interfaz Factoría e in­co­r­po­rar el creador como co­rre­s­po­n­da (mediante el Co­n­cre­te­Crea­tor).

Otra ventaja de este patrón es la co­m­pro­ba­bi­li­dad directa de los co­m­po­ne­n­tes Factory. Por ejemplo, si un creador pone en marcha tres clases, su fu­n­cio­na­li­dad puede probarse de manera in­di­vi­dual e in­de­pe­n­die­n­te a la clase a la que se esté apelando. En este último caso, solo hace falta ase­gu­rar­se de que apele co­rre­c­ta­me­n­te al creador, incluso si más adelante se extiende el software. Una ventaja adicional es la po­si­bi­li­dad de dar un nombre de­s­cri­p­ti­vo a los métodos Factory (a di­fe­re­n­cia del co­n­s­tru­c­tor de clase).

En cambio, el in­co­n­ve­nie­n­te principal del patrón de diseño Factory es que su im­ple­me­n­ta­ción conlleva un aumento si­g­ni­fi­ca­ti­vo del número de clases in­te­gra­das, ya que cada Co­n­cre­te­Pro­du­ct requiere un Co­n­cre­te­Crea­tor. Si bien el enfoque Factory es en principio ex­tre­ma­da­me­n­te pro­ve­cho­so de cara a la extensión del software, también resulta de­s­ve­n­ta­jo­so si co­n­si­de­ra­mos el esfuerzo que requiere. Si queremos ampliar una familia de productos, habrá que adaptar como co­rre­s­po­n­da no solo la interfaz, también todas las clases su­bo­r­di­na­das del Co­n­cre­te­Crea­tor. Por este motivo, es in­di­s­pe­n­sa­ble pla­ni­fi­car co­rre­c­ta­me­n­te y con an­te­la­ción los tipos de producto ne­ce­sa­rios.

Ventajas In­co­n­ve­nie­n­tes
Capacidad de expansión modular de la apli­ca­ción Requiere un número elevado de clases
Buena co­m­pro­ba­bi­li­dad La extensión de la apli­ca­ción es muy elaborada
Nombres de método si­g­ni­fi­ca­ti­vos

¿Cuándo se utiliza el patrón Factory?

Este patrón de diseño resulta valioso en diversas si­tua­cio­nes. En el software en el que los productos concretos que se crean se de­s­co­no­cen o no se definen con an­te­la­ción puede ser be­ne­fi­cio­so un enfoque al­te­r­na­ti­vo para gestionar las subclases. Los típicos casos en los que se utiliza incluyen marcos o bi­blio­te­cas de clases, que se han vuelto prá­c­ti­ca­me­n­te in­di­s­pe­n­sa­bles como marco básico para el de­sa­rro­llo de apli­ca­cio­nes modernas.

Los sistemas de au­te­n­ti­fi­ca­ción también se be­ne­fi­cian de las ventajas que ofrece el patrón Factory. En lugar de tener una clase central con diversos pa­rá­me­tros que varían en función de la au­te­n­ti­fi­ca­ción del usuario, el proceso de au­te­n­ti­fi­ca­ción puede delegarse en las clases Factory, que toman de­ci­sio­nes in­de­pe­n­die­n­tes sobre la gestión de cada usuario.

Además, diseñar siguiendo el enfoque del patrón Factory suele valer para cualquier software al que se añadan re­gu­la­r­me­n­te clases nuevas acordadas, sobre todo si estas clases tienen que pasar por el mismo proceso de creación.

Ejemplo del patrón Factory (PHP)

El patrón de diseño del Método Factoría puede uti­li­zar­se en diversas apli­ca­cio­nes con lenguajes de pro­gra­ma­ción di­fe­re­n­tes. Algunos de los re­pre­se­n­ta­n­tes más conocidos son Java, Ja­va­S­cri­pt, C++, C#, Python, y PHP. Uti­li­za­mos este último lenguaje de pro­gra­ma­ción en el siguiente ejemplo práctico, inspirado por una entrada de blog de Ph­p­mo­n­ke­ys.

En este caso, se crea una situación con la clase abstracta Car (Creador) y la clase Factory Ca­r­Fa­c­to­ry (Co­n­cre­te­Crea­tor). La primera se designa de la manera tan sencilla como sea posible y solo contiene código para es­ta­ble­cer un color para el coche (color por defecto: blanco) y leerlo.

class Car {
	private $color = null;
	public function __construct() {
		$this->color = "white";
	}
	public function setColor($color) {
		$this->color = $color;
	}
	public function getColor() {
		return $this->color;
	}
}

En la clase Factory, se presentan los métodos para los coches “rojos” (red) y “azules” (blue) así como un método privado para la propia creación de clase:

class CarFactory {
	private function __construct() {
	}
	public static function getBlueCar() {
		return self::getCar("blue");
	}
	public static function getRedCar() {
		return self::getCar("red");
	}
	private static function getCar($color) {
		$car = new Car();
		$car->setColor($color);
		return $car;
	}
}

Gracias al patrón Factory, este método Factory tan cla­ra­me­n­te dispuesto puede ampliarse con una extensa variedad de funciones adi­cio­na­les, como otros colores, marcas de coche o precio.

Ir al menú principal