Zielony Smok - logo witryny
Abstract Factory = fabryka abstrakcji.

Wzorzec projektowy Abstract Factory jest o jeden poziom abstrakcji wyżej niż wzorzec Factory Method. Na ogół wzorca używa się do otrzymania jednej z wielu powiązanych klas obiektów, z których każdy może zwrócić wiele innych obiektów.
Wzorzec ten jest fabryką (wytwórnią), która produkuje jedną z wielu grup klas. Jeśli używa się wzorca Factory, można zdecydować, którą klasę z tej
grupy zwrócić.

Abstract Factory jest często używana w Javie: SocketFactory, BorderFactory
etc.

Klasy

Fabryki

Klasa FabrykaSiedzib
package abstractfactory.fabryki;
import abstractfactory.groty.*;
import abstractfactory.jaskinie.*;
public abstract class FabrykaSiedzib {
    private static final String SIEDZIBA_LUKSUSOWA = "Luksusowa";
    private static final String SIEDZIBA_ZWYKLA = "Zwykła";
    public abstract Jaskinia getJaskinia();
    public abstract Grota getGrota();
    public static FabrykaSiedzib getFabrykaSiedzib(String type) {
        if (type.equals(FabrykaSiedzib.SIEDZIBA_LUKSUSOWA))
            return new FabrykaSiedzibLuksusowych();
        if (type.equals(FabrykaSiedzib.SIEDZIBA_ZWYKLA))
            return new FabrykaSiedzibZwyklych();
        return new FabrykaSiedzibLuksusowych();
    }
}
Klasa FabrykaSiedzibLuksusowych
package abstractfactory.fabryki;
import abstractfactory.groty.*;
import abstractfactory.jaskinie.*;
public class FabrykaSiedzibLuksusowych extends FabrykaSiedzib {
    @Override
    public Jaskinia getJaskinia() {
        return new JaskiniaLuksusowa("Jaskinia Lux");
    }
    @Override
    public Grota getGrota() {
        return new GrotaLuksusowa("Grota Lux");
    }
}
Klasa FabrykaSiedzibZwyklych
package abstractfactory.fabryki;
import abstractfactory.groty.*;
import abstractfactory.jaskinie.*;
public class FabrykaSiedzibZwyklych extends FabrykaSiedzib {
    @Override
    public Jaskinia getJaskinia() {
        return new JaskiniaZwykla("Jaskinia N");
    }
    @Override
    public Grota getGrota() {
        return new GrotaZwykla("Grota N");
    }
}

Groty

Klasa Grota
package abstractfactory.groty;
public interface Grota {
	String getNazwa();
	String getCechy();
}
Klasa GrotaLuksusowa
package abstractfactory.groty;
public class GrotaLuksusowa implements Grota {
    private final String nazwa;
    public GrotaLuksusowa(String nazwa) {
        this.nazwa = nazwa;
    }
    @Override
    public String getNazwa() {
        return nazwa;
    }
    @Override
    public String getCechy() {
        return "Cechy Groty Luksusowej ";
    }
}
Klasa GrotaZwykla
package abstractfactory.groty;
public class GrotaZwykla implements Grota {
    private final String nazwa;
    public GrotaZwykla(String nazwa) {
        this.nazwa = nazwa;
    }
    @Override
    public String getNazwa() {
        return nazwa;
    }
    @Override
    public String getCechy() {
        return "Cechy Zwykłej Groty ";
    }
}

Jaskinie

Klasa Jaskinia
package abstractfactory.jaskinie;
public interface Jaskinia {
    String getNazwa();
    String getCechy();
}
Klasa JaskiniaLuksusowa
package abstractfactory.jaskinie;
public class JaskiniaLuksusowa implements Jaskinia {
    private final String nazwa;
    public JaskiniaLuksusowa(String nazwa) {
        this.nazwa = nazwa;
    }
    @Override
    public String getNazwa() {
        return nazwa;
    }
    @Override
    public String getCechy() {
        return "Cechy Jaskini Luksusowej ";
    }
}
Klasa JazkiniaZwykla
package abstractfactory.jaskinie;
public class JaskiniaZwykla implements Jaskinia {
    private final String nazwa;
    public JaskiniaZwykla(String nazwa) {
        this.nazwa = nazwa;
    }
    @Override
    public String getNazwa() {
        return nazwa;
    }
    @Override
    public String getCechy() {
        return "Cechy Zwykłej Jaskini ";
    }
}

Wynik

Klasa Main
package abstractfactory;
import abstractfactory.fabryki.*;
import abstractfactory.groty.*;
import abstractfactory.jaskinie.*;
class Main {
    public static void main(String[] args) {
        String wynik = null;
        String kategoria = "Zwykła";
        String typ = "Jaskinia";
        FabrykaSiedzib fabryka = FabrykaSiedzib.getFabrykaSiedzib(kategoria);
        if (typ.equals("Jaskinia")) {
            Jaskinia c = fabryka.getJaskinia();
            wynik = "Nazwa: " + c.getNazwa() + "  Cechy: " + c.getCechy();
        }
        if (typ.equals("Grota")) {
            Grota s = fabryka.getGrota();
            wynik = "Nazwa: " + s.getNazwa() + "  Cechy: " + s.getCechy();
        }
        System.out.println(wynik);
    }
}
Nazwa: Jaskinia N  Cechy: Cechy Zwykłej Jaskini