Patrón de diseño: Factorías o Fábricas

 

Una factoría es un objeto que maneja la creación de otros objetos. Las factorías se utilizan cuando la creación de un objeto implica algo más que una simple instanciación.

Los siguientes ejemplos son casos donde una factoría puede ayudar:

  • Es necesario acceder a algún recurso para la creación y configuración de un objeto.
  • No conocemos hasta el momento preciso de la instanciación qué tipo concreto de objeto se va a instanciar.

En estos casos, en lugar de que sea el propio objeto quien se encargue de todos los aspectos relativos a la creación, se crea otro objeto que lo haga. De esta manera, se libera al objeto que va a ser creado de aquellas responsabilidades que no le corresponden pero que son necesarias para su creación, manteniendo su independencia.

 

El siguiente es un ejemplo de la utilización de una factoría para la creación de objetos. Se pueden crear figuras geométricas y calcular su área. Las figuras estarían definidas por una interfaz. Las figuras posibles son círculos y cuadrados.

 

Se va a utilizar una factoría para crear las figuras, puesto que no conocemos de antemano a qué clase pertenece el objeto que tenemos que instanciar. El uso de una factoría permite separar la lógica de negocio, igual para todos los casos, de la lógica de instanciación de los objetos. De esta forma el código queda más claro.

* archivo Figura.php
<?php
namespace prueba;
//declaro la interface Figura
public interface Figura {
    public double getArea();
}
?>

* archivo Circulo.php
<?php
namespace prueba;
// declaro la clase Circulo que implementa la interfaz Figura
public class Circulo implements Figura {
// declaro propiedad radio
    double radio;
// declaro constructor de la clase
    public Circulo(double radio) {
        this.radio = radio;
    }
// implemento la firma del metodo heredado de la interfaz
// y le agrego una funcionalidad
    public double getArea() {
        return (3.14 * radio * radio);
    }
}
?>

* archivo Cuadrado.php
<?php
namespace prueba;
// declaro la clase Cuadrado que implementa la interfaz Figura
public class Cuadrado implements Figura {
    double lado;
// declaro un constructor
    public Cuadrado(double lado) {
        this.lado = lado;
    }
// implemento la firma del metodo heredado de la interfaz
// y le agrego una nueva funcionalidad
// (*distinta a la declarada en Circulo)
    public double getArea() {
        return lado * lado;
    }
}
?>

* archivo FiguraFactory.php
<?php
namespace prueba;
// declaro la clase fabrica de Figuras
public class FiguraFactory {
// con estos valores fijos le digo a la fabrica
// si quiero que construya un cuadrado (pasando 0 como parámetro tipo en el método getFigura(0,lado))
// o si quiero que construya un circulo pasando 1 como parámetro en el método getFigura(1,lado)
    public final static int CUADRADO = 0;
    public final static int CIRCULO = 1;
 
 
    public static Figura getFigura(int tipo, double lado) {
        //con el switch se “ve” que tipo se pide 0 o 1
        switch (tipo) {
            // si se paso un 0 retorna un objeto cuadrado
            case CUADRADO:
                return new Cuadrado(lado);
            // si se le paso un 1 retorna un objeto circulo
            case CIRCULO:
                return new Circulo(lado);
        }
        return null;
    }
}
?>

* archivo Principal.php
<?php
namespace prueba;
// hacemos las pruebas
public class Principal {
    public static void main(String[] args) {
        
        int tipo = Integer.parseInt(args[0]);
        double lado = Double.parseDouble(args[0]);
            /*
//podríamos declarar los valores así:
int tipo=0; //para un cuadrado por ejemplo
double lado= 4;
            */
// creo un objeto figura desde la fabrica con
// los parámetros ingresados
        Figura figura =  FiguraFactory.getFigura(tipo, lado);
// y se muestra el resultado en pantalla con el metodo de la interfaz
        System.out.println(“El area de la figura es: ” + figura.getArea());
    }
}
?>

El ejemplo anterior se corresponde con el patrón de diseño Factory Method, que se refiere a la utilización de un método cuyo propósito principal es la creación de objetos.

 

Existe otro patrón de diseño denominado Abstract Factory, que proporciona una interfaz para crear familias de objetos que dependen entre sí, sin especificar sus clases concretas.

Podemos ver una explicación muy clara aqui http://lineadecodigo.com/patrones/patron-abstract-factory/

 

 

 

Fuentes:

http://tratandodeentenderlo.blogspot.com.uy/2010/02/patrones-de-diseno-factorias.html

Patrón Abstract Factory

12 opiniones en “Patrón de diseño: Factorías o Fábricas”

  1. An outstanding share! I’ve just forwarded this onto a co-worker who has been conducting a little research on this. And he in fact bought me dinner simply because I stumbled upon it for him… lol. So allow me to reword this…. Thank YOU for the meal!! But yeah, thanx for spending some time to discuss this matter here on your web site.

  2. You actually make it seem really easy together with your presentation however I to find this topic to be actually one thing that I believe I would never understand. It sort of feels too complicated and extremely vast for me. I am looking forward in your next publish, I’ll attempt to get the hold of it!

Deja un comentario