Alternative Implementierungen der Factory

Neben dem Factory Method und Abstract Factory Entwurfsmuster gibt es zwei alternative Implementierungen der Factory. Es sind die Simple Factory (einfache Fabrik) und die Static Factory Method (statische Fabrikmethode). Diese Implementierungen sind keine Entwurfsmuster, sondern eher Programmieridiome. Dennoch ist es wichtig sie zu kennen und zu wissen wann ihr Einsatz sinnvoll ist.

Um die Implementierung zu erläutern, greifen wir das Beispiel der Pizzeria wieder auf, welches bereits bei den Factory Entwurfsmustern verwendet wurde.

Simple Factory

Die einfache Fabrik ähnelt dem Factory Method-Entwurfsmuster. Die Fabrikmethode wird hierbei jedoch in eine eigene Klasse ausgelagert. Daher werden wir die CreatePizza() Methode aus der abstrakten PizzaStore Klasse in die neue abstrakte PizzaFactory Klasse auslagern, und die PizzaStore Klasse um eine Eigenschaft für die PizzaFactory ergänzen. Der Code der CreatePizza() Methode bleibt dabei unverändert.

public abstract class PizzaFactory
{
	public abstract Pizza CreatePizza(string type);
}

public abstract class PizzaStore
{
	private PizzaFactory _factory;

	public PizzaStore(PizzaFactory factory)
	{
		_factory = factory;
	}

	public Pizza OrderPizza(string type)
	{
		Pizza pizza = _factory.CreatePizza(type);
		pizza.Prepare();
		pizza.Bake();
		pizza.Cut();
		pizza.Box();

		return pizza;
	}
}

public class NewYorkPizzaFactory : PizzaFactory
{
	public override Pizza CreatePizza(string type)
	{
		Pizza pizza = null;

		switch (type)
		{
			case PizzaType.CHEESE:
				pizza = new CheesePizza();
				pizza.Name = "New York Cheese Pizza";
				break;

			case PizzaType.CLAM:
				pizza = new ClamPizza();
				pizza.Name = "New York Clam Pizza";
				break;

			case PizzaType.PEPPERONI:
				pizza = new PepperoniPizza();
				pizza.Name = "New York Pepperoni Pizza";
				break;

			case PizzaType.VEGGIE:
				pizza = new VeggiePizza();
				pizza.Name = "New York Veggie Pizza";
				break;

			default:
				throw new ArgumentException(String.Format("Unkonown Pizza Type '{0}'", type));
		}

		return pizza;
	}
}

Der Unterschied zu dem Factory Method-Muster liegt darin, dass jetzt nicht mehr die Unterklassen der PizzaStore Klasse entscheiden, welche konkreten Pizza Objekte erstellt werden. Diese Entscheidung wird den Unterklassen durch die Komposition mit der entsprechenden PizzaFactory Klasse abgenommen.

static void Main(string[] args)
{
	PizzaFactory pizzaFactory = new NewYorkPizzaFactory();
	PizzaStore pizzaStore = new NewYorkPizzaStore(pizzaFactory);

	Pizza pizza = pizzaStore.OrderPizza(PizzaType.CHEESE);
	Console.WriteLine(pizza.ToString());

	pizza = pizzaStore.OrderPizza(PizzaType.PEPPERONI);
	Console.WriteLine(pizza.ToString());

	Console.ReadLine();
}

Das Ziel ist das gleiche: die Instanziierung der konkreten Objekte aus dem Client-Code zu entfernen. Die einfache Fabrik hat den Vorteil, dass sie von mehreren Clients genutzt werden kann, die die konkreten Objekte jeweils auf unterschiedliche Weise nutzen.

Static Factory Method

„Eine einfache Fabrik als eine statische Methode zu definieren ist eine gebräuchliche Technik“ (EvKbF S. 115). Diese Technik wird z.B. eingesetzt, um Objekte zu erstellen ohne sie instanziieren zu müssen, um ein Objekt mit einer bestimmten Konfiguration zu instanziieren oder um die Instanziierung zu vereinfachen. Ein Beispiel für die Vereinfachung der Instanziierung eines Objektes ist die Tulpe-Klasse des .NET Frameworks.

In unserem Beispiel ergänzen wir die konkrete PizzaFactory Klasse um eine statische Fabrikmethode.

public class NewYorkPizzaFactory : PizzaFactory
{
	public static NewYorkPizzaFactory CreateFactory()
	{
		return new NewYorkPizzaFactory();
	}

	public override Pizza CreatePizza(string type)
	{ ... }
}

static void Main(string[] args)
{
	PizzaFactory pizzaFactory = NewYorkPizzaFactory.CreateFactory();
	PizzaStore pizzaStore = new NewYorkPizzaStore(factory);

	...
}

Bei der Nutzung dieser Technik ist es jedoch nicht möglich Unterklassen zu bilden, um das Verhalten der Fabrikmethode zu ändern. Wie die Bezeichnung es bereits nahelegt, ist das Verhalten statisch.

Quellen

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.