using System; using System.Collections.Generic; class SampleProgram { static void Main(string[] args) { //Fügen einen neuen Kaffee hinzu - Aufruf über krönung CoffeeFactory.Jacobs.Invent("krönung", CreateKroenung); do { Console.Write("Bitte Wahl eingeben: "); var coffeeKind = Console.ReadLine(); var coffee = CoffeeFactory.Jacobs.Brew(coffeeKind); } while (true); } static CoffeeKind CreateKroenung() { return new KroenungsCoffee(); } } class CoffeeFactory { #region Singleton static CoffeeFactory jacobs; public static CoffeeFactory Jacobs { get { return jacobs ?? (jacobs = new CoffeeFactory()); } } #endregion Dictionary> coffeeKinds; private CoffeeFactory() { //Func sagt dem Compiler nur, wie die Signatur der Funktion aussieht: //in diesem Fall 0 Argumente und Rückgabe vom Typ CoffeeKind coffeeKinds = new Dictionary>(); } public void Invent(String kind, Func creator) { //Legen einen neuen Eintrag, kind zu creator ab. //D.h. unter dem Schlüssel mit dem Wert von kind, soll sich der Wert in Form einer Funktion creator befinden coffeeKinds.Add(kind, creator); Console.WriteLine("Es wurde was erfunden: " + kind); } public CoffeeKind Brew(String kind) { if (coffeeKinds.ContainsKey(kind)) { //Holen die abgelegte Funktion var creator = coffeeKinds[kind]; Console.WriteLine("Hier bitte! Dein Kaffee ist fertig."); Console.WriteLine("zzzz (" + kind + ")"); //Geben das Ergebnis des Aufrufs der Funktion zurück return creator(); } Console.WriteLine("Deine Wahl war schlecht. Das haben wir nicht im Angebot!"); return null; } } abstract class CoffeeKind { } class EspressoCoffee : CoffeeKind { } class LatteCoffee : CoffeeKind { } class KroenungsCoffee : CoffeeKind { }