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.