¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. Design Patterns en PHP
  3. El patrón de diseño Abstract Factory
Extrait - Design Patterns en PHP Los 23 patrones de diseño: descripciones y soluciones ilustradas en UML2 y PHP (2ª edición)
Extractos del libro
Design Patterns en PHP Los 23 patrones de diseño: descripciones y soluciones ilustradas en UML2 y PHP (2ª edición) Volver a la página de compra del libro

El patrón de diseño Abstract Factory

Descripción

El objetivo del patrón de diseño Abstract Factory es la creación de objetos agrupados en familias sin tener que conocer las clases concretas.

Ejemplo

El sistema de venta de vehículos gestiona vehículos que funcionan con gasolina y vehículos eléctricos. Esta gestión está delegada en el objeto Catalogo encargado de crear tales objetos.

Para cada producto, disponemos de una clase abstracta, de una subclase concreta que describe una versión del producto que funciona con gasolina y de una subclase concreta que describe una versión del producto que funciona con electricidad. Por ejemplo, en la figura 4.1, para el objeto Scooter, existe una clase abstracta Scooter y dos subclases concretas ScooterElectricidad y ScooterGasolina.

El objeto Catalogo puede utilizar estas subclases concretas para instanciar los productos. No obstante si fuera necesario incluir nuevas clases de familias de vehículos (diésel o híbrido gasolina-eléctrico), las modificaciones a realizar en el objeto Catalogo podrían resultar bastante fastidiosas.

El patrón de diseño Abstract Factory resuelve este problema introduciendo una interfaz FabricaVehiculoInterfaz. Esta interfaz contiene la firma de los métodos que se deben utilizar para crear cada producto. El tipo devuelto por estos métodos está constituido por una de las clases abstractas del producto. De este modo el objeto Catalogo no necesita conocer las subclases concretas y permanece totalmente independiente de las familias de productos. Desvelando la interfaz de nuestras...

Estructura

1. Diagrama de clases

La figura 4.2 detalla la estructura genérica del patrón.

images/figure32.PNG

Figura 4.2 - Estructura del patrón de diseño Abstract Factory

2. Participantes

Los participantes del patrón de diseño Abstract Factory son los siguientes: 

  • FabricaAbstracta (FabricaVehiculoInterfaz) es una interfaz que define las firmas de los métodos que crean los distintos productos.

  • FabricaConcreta1FabricaConcreta2 (FabricaVehiculoElectricidad, FabricaVehiculoGasolina) son las clases concretas que implementan los métodos que crean los productos para cada familia de productos. Conociendo la familia y el producto, son capaces de crear una instancia del producto para esta familia.

  • ProductoAbstractoA y ProductoAbstractoB (AbstractScooter y AbstractAutomovil) son las clases abstractas de los productos independientemente de su familia. Las familias se introducen en las subclases concretas.

  • Cliente (Catalogo) es la clase que utiliza la interfaz FabricaAbstracta.

3. Colaboraciones

La clase Catalogo utiliza una instancia de una de las fábricas concretas para crear sus productos a partir de la interfaz expuesta por FabricaAbstractaInterfaz.

Se recomienda crear una sola instancia de cada fábrica concreta, que puede compartirse por varios clientes. Veremos más adelante un patrón de diseño capaz de garantizar que una sola instancia de una clase está disponible en la ejecución:...

Dominios de uso

El patrón de diseño Abstract Factory se utiliza en los dominios siguientes:

  • Un sistema que utiliza productos necesita ser independiente de la forma en que se crean y agrupan estos productos.

  • Un sistema está configurado según varias familias de productos que pueden evolucionar.

Ejemplo en PHP

A continuación, veamos un ejemplo de uso del patrón de diseño escrito en PHP. El código PHP correspondiente a la clase abstracta AbstractAutomovil y sus subclases aparece a continuación. Es muy sencillo, describe las cuatro propiedades de los automóviles así como el método mostrarCaracteristicas que permite visualizarlas.

<?php 
 
declare(strict_types=1);  
 
namespace ENI\DesignPatterns\AbstractFactory;  
 
abstract class AbstractAutomovil  
{  
   protected string $marca;  
 
   protected string $color;  
 
   protected int $potencia;  
 
   protected float $espacio;  
 
   public function __construct(string $marca, string $color,  
int $potencia, float $espacio)  
   {  
       $this->marca = $marca;  
       $this->color = $color;  
       $this->potencia = $potencia;  
       $this->espacio = $espacio;  
   }  
 
   abstract public function mostrarCaracteristicas(): void;  
}  
 
 
<?php  
 
declare(strict_types=1);  
 
namespace ENI\DesignPatterns\AbstractFactory;  
 
class AutomovilElectricidad extends AbstractAutomovil  
{  
   public function mostrarCaracteristicas(): void  
   {  
       echo "Automóvil eléctrico - marca: $this->marca"  
           . ", color: $this->color"  
           . ", potencia: $this->potencia"  
           . ", espacio: $this->espacio" . PHP_EOL;  
   }  
}  
 
 
<?php...