El patrón Factory Method
Descripción
El objetivo del patrón Factory Method es proveer un método abstracto de creación de un objeto delegando en las subclases concretas su creación efectiva.
Ejemplo
Vamos a centrarnos en los clientes y sus pedidos. La clase Cliente implementa el método creaPedido que debe crear el pedido. Ciertos clientes solicitan un vehículo pagando al contado y otros clientes utilizan un crédito. En función de la naturaleza del cliente, el método creaPedido debe crear una instancia de la clase PedidoContado o una instancia de la clase PedidoCrédito. Para realizar estas alternativas, el método creaPedido es abstracto. Ambos tipos de cliente se distinguen mediante dos subclases concretas de la clase abstracta Cliente:
-
La clase concreta ClienteContado cuyo método creaPedido crea una instancia de la clase PedidoContado.
-
La clase concreta ClienteCrédito cuyo método creaPedido crea una instancia de la clase PedidoCrédito.
Tal diseño está basado en el patrón Factory Method, el método creaPedido es el método de fabricación. El ejemplo se detalla en la figura 2-4.1.
Figura 2-4.1 - El patrón Factory Method aplicado a los clientes y sus pedidos
Estructura
1. Diagrama de clases
La figura 2-4.2 detalla la estructura genérica del patrón.
Figura 2-4.2 - Estructura del patrón Factory Method
2. Participantes
Los participantes del patrón son los siguientes:
-
CreadorAbstracto (Cliente) es una clase abstracta que implementa la firma del método de fabricación y los métodos que invocan al método de fabricación.
-
CreadorConcreto (ClienteContado, ClienteCrédito) es una clase concreta que implementa el método de fabricación. Pueden existir varios creadores concretos.
-
Producto (Pedido) es una clase abstracta que describe las propiedades comunes de los productos.
-
ProductoConcreto (PedidoContado, PedidoCrédito) es una clase concreta que describe completamente un producto.
3. Colaboraciones
Los métodos concretos de la clase CreadorAbstracto se basan en la implementación del método de fabricación en las subclases. Esta implementación crea una instancia de la subclase adecuada de Producto.
Dominios de uso
El patrón se utiliza en los casos siguientes:
-
Una clase que sólo conoce los objetos con los que tiene relaciones.
-
Una clase quiere transmitir a sus subclases las elecciones de instanciación aprovechando un mecanismo de polimorfismo.
Ejemplo en Java
El código fuente de la clase abstracta Pedido y de sus dos subclases concretas aparece a continuación. El importe del pedido se pasa como parámetro al constructor de la clase. Si la validación de un pedido al contado es sistemática, tenemos la posibilidad de escoger, para nuestro ejemplo, aceptar únicamente aquellos pedidos provistos de un crédito cuyo valor se sitúe entre 1.000 y 5.000.
public abstract class Pedido
{
protected double importe;
public Pedido(double importe)
{
this.importe = importe;
}
public abstract boolean valida();
public abstract void paga();
}
public class PedidoContado extends Pedido
{
public PedidoContado(double importe)
{
super(importe);
}
public void paga()
{
System.out.println(
"El...