Sablonul de proiectare Factory

Descriere

Sablonul factory este utilizat in procesul de construire a obiectelor. In cadrul acestui sablon obiectele sunt construire fara a expune catre client logica de construire a acestora. Obiectele construite fac parte dintr-o ierarhie de clase.

Sablonul factory este recomandat atunci cand procesul de construire este complex. Pentru a nu expune procesul de construire a acestor obiecte, si pentru a asigura gestionarea acestor procese intr-un mod cetralizat se utilizeaza sablonul factory.

Acest sablon exte utilizat inclusiv in JDK in:

  • java.sql.DriverManager.getConnection()
  • java.net.URL.openConnection()
  • java.lang.Class.newInstance()
  • java.lang.Class.forName()

Diagrama UML

Diagrama UML ce exemplifica sablonul Factory este prezentata mai jos:

Exemplu

abstract class Product {
 
    public void writeName(String name) {
        System.out.println("My name is " + name);
    }
}
 
class ProductA extends Product {
}
 
class ProductB extends Product {
 
    public void writeName(String name) {
        StringBuilder tempName = new StringBuilder().append(name);
        System.out.println("My reversed name is"
                + tempName.reverse());
    }
}
 
class ProductFactory {
 
    Product createProduct(String type) {
        if (type.equals("B")) {
            return new ProductB();
        } else {
            return new ProductA();
        }
    }
}
 
public class TestClientFactory {
 
    public static void main(String[] args) {
        ProductFactory pf = new ProductFactory();
        Product prod;
        prod = pf.createProduct("A");
        prod.writeName("John Doe");
        prod = pf.createProduct("B");
        prod.writeName("John Doe");
    }
}

O varianta modificata a programului de mai sus este prezentata in listingul urmator. Se utilizeaza tipul enum pentru stocarea tipului de obiecte si metoda factory a fost facuta statica.

abstract class Product {
 
    public void writeName(String name) {
        System.out.println("My name is " + name);
    }
}
 
class ProductA extends Product {
}
 
class ProductB extends Product {
 
    public void writeName(String name) {
        StringBuilder tempName = new StringBuilder().append(name);
        System.out.println("My reversed name is"
                + tempName.reverse());
    }
}
 
enum ProductType{
    PRODUCT_A,PRODUCT_B;
}
 
class ProductFactory{
    static Product createProduct(ProductType type){
        switch(type){
            case PRODUCT_A:
                return new ProductA();
            case PRODUCT_B:
                return new ProductB();
            default:
                throw new IllegalArgumentException("Invalid product type speciffied.");
        }
    }
}
 
public class TestClientFactory {
     public static void main(String[] args) {
        Product prod;
        prod = ProductFactory.createProduct(ProductType.PRODUCT_A);
        prod.writeName("John Doe");
        prod = ProductFactory.createProduct(ProductType.PRODUCT_B);
        prod.writeName("John Doe");
    }
}