Sablonul de proiectare Absract Factory
Descriere
Sablonul abstract factory este un sablon creational ce adauga un nivel suplimentar de abstractizare fata de sablonul factory. Acest sablon ofera un mecanism de incapsulare a unui grup similar de obiecte de tip factory ce au in comun o anumita tema - obiectele de tip factory construiesc familii de obiecte cu caracteristici similare - ce sunt utilizate de client. Clientul nu cunoaste (si nu il intereseaza) tipul concret al familie de obiecte deoarece obine o referinta catre tipul abstract (interfata) de baza a obiectelor construite de catre factory.
Diagrama UML
Exemplu
public abstract class AbstractFactory { public abstract AbstractProductA createProductA(); public abstract AbstractProductB createProductB(); } public abstract class AbstractProductA { public abstract void useProduct(); } public abstract class AbstractProductB { public abstract void useProduct(); } class LuxuryProductA extends AbstractProductA { @Override public void useProduct() { System.out.println("Luxury product A has been used."); } } class LuxuryProductB extends AbstractProductB { @Override public void useProduct() { System.out.println("Luxury product B has been used."); } } public class LuxuryProductFactory extends AbstractFactory { @Override public AbstractProductA createProductA() { return new LuxuryProductA(); } @Override public AbstractProductB createProductB() { return new LuxuryProductB(); } } public class RegularProductA extends AbstractProductA { @Override public void useProduct() { System.out.println("Regular product A has been used."); } } public class RegularProductB extends AbstractProductB { @Override public void useProduct() { System.out.println("Regular product A has been used."); } } public class RegularProductFactory extends AbstractFactory { @Override public AbstractProductA createProductA() { return new RegularProductA(); } @Override public AbstractProductB createProductB() { return new RegularProductB(); } } public class Client { private int income; Client(){ Random r = new Random(); income = r.nextInt(3000); System.out.println("A client with a "+income+"$ income has been created."); } public int getIncome(){ return income; } public void useProductA(AbstractProductA p){ p.useProduct(); } public void useProductB(AbstractProductB p){ p.useProduct(); } } public class TestClientFactory { public static void main(String[] args) { AbstractFactory factory = null; //testing product factory for (int i = 0; i < 10; i++) { Client c = new Client(); if (c.getIncome() < 1500) { factory = new RegularProductFactory(); } else { factory = new LuxuryProductFactory(); } AbstractProductA p1 = factory.createProductA(); AbstractProductB p2 = factory.createProductB(); c.useProductA(p1); c.useProductB(p2); try{Thread.sleep(1000);}catch(Exception e){} } } }
Rezultatul rularii codului:
A client with a 1020$ income has been created. Regular product A has been used. Regular product A has been used. A client with a 2628$ income has been created. Luxury product A has been used. Luxury product B has been used. A client with a 407$ income has been created. Regular product A has been used. Regular product A has been used. A client with a 2303$ income has been created. Luxury product A has been used. Luxury product B has been used. A client with a 359$ income has been created. Regular product A has been used. Regular product A has been used. A client with a 1016$ income has been created. Regular product A has been used. Regular product A has been used. A client with a 397$ income has been created. Regular product A has been used. Regular product A has been used. A client with a 1148$ income has been created. Regular product A has been used. Regular product A has been used. A client with a 1308$ income has been created. Regular product A has been used. Regular product A has been used. A client with a 2582$ income has been created. Luxury product A has been used. Luxury product B has been used.