Design Pattern #2

Autor: NathalieOhneHerz GitHub

Das Factory Pattern - Kinder zeugen leicht gemacht für jedermann.

Hauptartikel: [Design Pattern #1] Was sind die Design patterns

Im Folgenden soll das "Factory Pattern" genauer beleuchtet werden.


Was ist das Factory Pattern und wann verwendet man es?

Das Factory Pattern findet sehr häufig Verwendung. Es fällt in die Kategorie der Erzeugungsmuster. Es soll einen der besten und meist erprobten Wege darlegen, wie man Objekte erstellen kann. Man kann das Factory Pattern sehr gut nutzen, um schwierige und lange Instanzierungen zusammenzufassen. Dabei verbirgt man die wirkliche Instanzierung vor dem Nutzer, was oft als aufgeräumt und besser strukturiert wahrgenommen wird. Ebenso kann die Factory als Standard leicht angepasst werden sollte sich ein Konstruktor ändern. Sprich: Wenn ich ein und denselben Konstruktor in mehreren Klassen aufrufe, ist eine Abstrahierung nach dem Factory Pattern möglich und ratsam. In diesem Zuge ermöglicht es die Factory, schnell zwischen mehreren Implementationen zu wechseln. Vorausgesetzt die Factorymethode gibt ein Interface zurück, so müsste ich nicht im ganzen Projekt den Aufruf des Konstruktors ändern, sondern bin mit einer Änderung fertig. Ein weiterer Punkt ist, dass ihr die Konstruktion eines Objektes von seiner Semantik und Verwendung trennen könnt. Das kann große Vorteile bieten, wenn es zum Beispiel möglich ist, Instanzen zu Cachen oder wenn die Einpflegung eines Objektes nicht durch seine Erzeugung abgeschlossen ist (Beispiel: Wir erzeugen einen neuen Spieler, registrieren ihn in einer Registry...).


Modellierung

Implementation in Java

Im Folgenden werden wir uns Haustiere zulegen. Wir gehen von folgender Modellierung aus:

Java package de.nathalieoneill.devtek.pet; /** * @author Nathalie */ public abstract class DevTekPet { private final String name; private final String holder; protected DevTekPet(String name, String holder) { this.name = name; this.holder = holder; } public abstract void speak(); public String getName() { return name; } public String getHolder() { return holder; } }
package de.nathalieoneill.devtek.pet.impl; import de.nathalieoneill.devtek.pet.DevTekPet; /** * @author Nathalie */ public class DevTekPetUnicorn extends DevTekPet { public DevTekPetUnicorn(String name, String holder) { super(name, holder); } @Override public void speak() { System.out.println("PINK FULUFFY UNICOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOORN"); } }
package de.nathalieoneill.devtek.pet.impl; import de.nathalieoneill.devtek.pet.DevTekPet; /** * @author Nathalie */ public class DevTekPetDog extends DevTekPet { public DevTekPetDog(String name, String holder) { super(name, holder); } @Override public void speak() { System.out.println("PINK FULUFFY DOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOG"); } }
package de.nathalieoneill.devtek.factory; import java.util.ArrayList; import java.util.List; /** * @author Nathalie */ public class DevTekPetRegistry { private static List pets = new ArrayList(); public static List getPets() { return pets; } public static void registerPet(DevTekPet pet) { pets.add(pet); } }

Die Verwendung sähe dann so aus:

package de.nathalieoneill.devtek.pet; import de.nathalieoneill.devtek.pet.impl.DevTekPetDog; import de.nathalieoneill.devtek.pet.impl.DevTekPetUnicorn; /** * @author Nathalie */ public class DevTekPetFactory { public static DevTekPet createDevTekPet(String petType, String petName, String petHolder) { DevTekPet pet = null; if ("unicorn".equalsIgnoreCase(petType)) { pet = new DevTekPetUnicorn(petName, petHolder); } else if ("dog".equalsIgnoreCase(petType)) { pet = new DevTekPetDog(petName, petHolder); } if (pet == null) return pet; DevTekPetRegistry.registerPet(pet); return pet; } }
package de.nathalieoneill.devtek; import de.nathalieoneill.devtek.pet.DevTekPet; import de.nathalieoneill.devtek.pet.DevTekPetFactory; import de.nathalieoneill.devtek.pet.DevTekPetRegistry; import java.util.List; /** * @author Nathalie */ public class DevTek { public static void main(String[] args) { final DevTekPet unicornPet = DevTekPetFactory.createDevTekPet("unicorn", "Fluffy", "Nathalie"); final DevTekPet dogPet = DevTekPetFactory.createDevTekPet("dog", "Fluffy", "Nathalie"); final List<DevTekPet> pets = DevTekPetRegistry.getPets(); for (DevTekPet pet : pets) { pet.speak(); } } }

Das "Factory Pattern" konnte ich euch hoffentlich näher bringen.

Mit freundlichen Grüßen
Nathalie