Design Pattern #2.1

Autor: NathalieOhneHerz GitHub

Das Abstract Factory Pattern

Ich baue die Fabrik, die eine Fabrik fabriziert, die etwas fabriziert. Was hab ich da nur wieder fabriziert.

Hauptartikel: [Design Pattern #1] Was sind die Design patterns und [Design Pattern #2] Das Factory Pattern


Was ist das Abstract Factory Pattern?

Der geneigte Leser fragt: Wieso sollte ich eine Fabrik für eine Fabrik bauen? Ist das nicht als würde ich meine Briefe in einem Paket verschicken? Ja, genau so ist das. Bei dem Abstract Factory Pattern geht es darum, die Erzeugung von Objekten noch weiter zu verkapseln, was zum Beispiel sinnvoll wird, wenn man verschiedene Polymorphe Objektgruppen plattformunabhängig machen möchte.


Modellierung

package de.nathalieoneill.devtek.factory.v2; /** * @author Nathalie */ public class Pizza { }
package de.nathalieoneill.devtek.factory.v2; /** * @author Nathalie */ public class Sausage { }
package de.nathalieoneill.devtek.factory.v2; /** * @author Nathalie */ public class PizzaExtraCheese extends Pizza { }
package de.nathalieoneill.devtek.factory.v2; /** * @author Nathalie */ public class PizzaExtraFat extends Pizza { }
package de.nathalieoneill.devtek.factory.v2; /** * @author Nathalie */ public class SausageExtraFat extends Sausage { }
package de.nathalieoneill.devtek.factory.v2; /** * @author Nathalie */ public class SausageExtraSmall extends Sausage { }
package de.nathalieoneill.devtek.factory.v2; /** * @author Nathalie */ public abstract class AbstractFoodFactory { public abstract Sausage createSausage(boolean extraFat); public abstract Pizza createPizza(boolean extraFat); }
package de.nathalieoneill.devtek.factory.v2; /** * @author Nathalie */ public class PizzaFactory extends AbstractFoodFactory { @Override public Sausage createSausage(boolean extraFat) { throw new UnsupportedOperationException(); } @Override public Pizza createPizza(boolean extraFat) { return extraFat ? new PizzaExtraFat() : new PizzaExtraCheese(); } }
package de.nathalieoneill.devtek.factory.v2; /** * @author Nathalie */ public class SausageFactory extends AbstractFoodFactory { @Override public Sausage createSausage(boolean extraFat) { return extraFat ? new SausageExtraFat() : new SausageExtraSmall(); } @Override public Pizza createPizza(boolean extraFat) { throw new UnsupportedOperationException(); } }
package de.nathalieoneill.devtek.factory.v2; /** * @author Nathalie */ public class FoodFactoryProducer { public static AbstractFoodFactory createFoodFactory(String foodType) { if ("pizza".equalsIgnoreCase(foodType)) return new PizzaFactory(); else return new SausageFactory(); } }

Die Verwendung sähe dann so aus:

package de.nathalieoneill.devtek.factory.v2; /** * @author Nathalie */ public class DevTek { public static void main(String[] args) { Pizza pizza = FoodFactoryProducer.createFoodFactory("pizza").createPizza(true); Sausage sausage = FoodFactoryProducer.createFoodFactory("sausage").createSausage(false); System.out.println(pizza.getClass()); System.out.println(sausage.getClass()); } }

Ich hoffe dass ich euch die FabrikFabrik näher bringen konnte. Danke an Aquaatic der sich das hier sehr sehr indirekt gewünscht hat.

Mit freundlichen Grüßen
Nathalie