informaticaPC

Patrones de Diseño Software

Factory Method

Podemos utilizar este patrón cuando definamos una clase a partir de la que se crearán objetos pero sin saber de qué tipo son, siendo otras subclases las encargadas de decidirlo.

Patrón Factoría

Veamos un sencillo ejemplo en el que lo utilizamos para crear objetos de tipo IArchivo:

Main.java:

package FactoryMethod1;

public class Main
{
    public static void main(String[] args)
    {
        CreadorAbstracto creator = new Creador();

        IArchivo audio = creator.crear( Creador.AUDIO );
        audio.reproducir();

        IArchivo video = creator.crear( Creador.VIDEO );
        video.reproducir();
    }
}

IArchivo.java (Producto según el diagrama anterior):

package FactoryMethod2;

public interface IArchivo
{
    public void reproducir();
}

ArchivoAudio.java (un ProductoConcreto según el diagrama anterior):

package FactoryMethod2;

public class ArchivoAudio implements IArchivo
{
    public ArchivoAudio() {
    }

    // -----------------------------

    @Override
    public void reproducir() {
        System.out.println("Reproduciendo archivo de audio...");
    }
}

ArchivoVideo.java (un ProductoConcreto según el diagrama anterior):

package FactoryMethod2;

public class ArchivoVideo implements IArchivo
{
    public ArchivoVideo() {
    }

    // -----------------------------

    @Override
    public void reproducir() {
        System.out.println("Reproduciendo archivo de vídeo...");
    }
}

CreadorAbstracto.java (Creador según el diagrama anterior):

package FactoryMethod1;

public abstract class CreadorAbstracto
{
    public static final int AUDIO = 1;
    public static final int VIDEO = 2;

    // --------------------------------

    public abstract IArchivo crear(int tipo);
}

Creador.java (CreadorConcreto según el diagrama anterior):

package FactoryMethod1;

public class Creador extends CreadorAbstracto
{
    public void Creador() {
    }

    // -------------------------------------------

    @Override
    public IArchivo crear(int tipo)
    {
        IArchivo objeto;

        switch( tipo )
        {
            case AUDIO:
                objeto = new ArchivoAudio();
                break;
            case VIDEO:
                objeto = new ArchivoVideo();
                break;
            default:
                objeto = null;
        }

        return objeto;
    }
}

Al ejecutarlo obtendríamos como resultado:

Ejemplo

EXPLICACIÓN:

  • Creamos dos clases de tipo IArchivo así como la clase abstracta en la que se define el método de fabricación, y otra que hereda de ella y lo implementa.
  • En el programa principal se crea una instancia de la clase que implementa el método de fabricación, el cual usaremos para crear y devolver los distintos tipos de objetos.

Una variante de la forma anterior es la siguiente:

Main.java:

package FactoryMethod2;

public class Main
{
    public static void main(String[] args)
    {
        IArchivo video = Creador.getArchivo( Creador.VIDEO );
        video.reproducir();

        IArchivo audio = Creador.getArchivo( Creador.AUDIO );
        audio.reproducir();
    }
}

Creador.java:

package FactoryMethod2;

public class Creador
{
    public static final int AUDIO = 1;
    public static final int VIDEO = 2;

    // ---------------------------------------

    public Creador() {
    }

    // ---------------------------------------

    public static IArchivo getArchivo(int tipo)
    {
        IArchivo objeto;

        switch( tipo )
        {
            case AUDIO:
                objeto = new ArchivoAudio();
                break;
            case VIDEO:
                objeto = new ArchivoVideo();
                break;
            default:
                objeto = null;
        }

        return objeto;
    }
}

EXPLICACIÓN: en este caso se omite la creación de la clase abstracta, definiéndose como static el método de fabricación.

El resultado obtenido sería el mismo que en el caso anterior.

Primera página Anterior Siguiente Última página
Usamos cookies para ofrecerte una experiencia mejorada, el continuar navegando supone que aceptas su uso