Factory method

De la Viquipèdia, l'enciclopèdia lliure

El Factory Method és un patró de disseny del Software. Consisteix a utilitzar una classe constructora (semblant a l'Abstract Factory) abstracta amb uns quants mètodes definits i uns altres d'abstractes: el dedicat a la construcció dels objectes d'un subtipus d'un tipus determinat. És una simplificació de l'Abstract Factory, on la classe abstracta té mètodes concrets que en fan servir alguns dels abstractes; segons usem una o altra filla d'aquesta classe abstracta, tindrem un comportament o un altre.

Estructura[modifica]

Les classes principals d'aquest patró són el creador i el producte. El creador necessita crear instàncies de productes, però el tipus concret de producte no ha de ser forçat en les subclasses del creador, perquè aleshores les possibles subclasses del creador haurien de poder especificar subclasses del producte a utilitzar.


Factory method

La solució per fer això és utilitzar un mètode abstracte (el mètode de la fàbrica) que es defineix en el creador. Aquest mètode abstracte es defineix perquè torni el producte. Les subclasses del creador poden sobreescriure aquest mètode per tornar les subclasses apropiades del producte.

Exemples de codi (Java)[modifica]

// Definim la classe abstracte creadora
public abstract class Creator{
 // Operació que realitza 
 public Product anOperation() {
 Product aProduct = factoryMethod();
 return aProduct;
 }

 // Definim el mètode abstracte
 protected abstract Product factoryMethod();
}

Ara definim el creador concret.

public class ConcreteCreator extends Creator{
 protected Product factoryMethod() {
 return new ConcreteProduct();
 }
}

I definim el producte i la seva implementació concreta.

public interface Product{
 public void operacio();
}

public class ConcreteProduct implements Product{
 public void operacio(){
 System.out.println("Una operació d'aquest producte");
 }
}

i un exemple d'ús :

public static void main(String args[]){
 Creator aCreator;
 aCreator = new ConcreteCreator();
 Product producte = aCreator.anOperation();
 producte.operacio();
}

Enllaços externs[modifica]