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
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"); } }