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.
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.