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