using System.Collections.Generic;
public static void Main()
PizzaStore nypizzastore = new NYPizzaStore();
Pizza pizzaNY = nypizzastore.OrderPizza("Cheese");
Console.WriteLine(pizzaNY.GetName());
Console.WriteLine("==========================");
Console.WriteLine("Ingredients of " + pizzaNY.GetName() + ":");
Console.WriteLine(pizzaNY.GetDough().ToString());
Console.WriteLine(pizzaNY.GetSauce().ToString());
Console.WriteLine(pizzaNY.GetCheese().ToString());
Console.WriteLine(pizzaNY.GetDough().ToString());
public abstract class PizzaIngredientFactory
public abstract Dough CreateDough();
public abstract Sauce CreateSauce();
public abstract Cheese CreateCheese();
public abstract Clams CreateClams();
public abstract class Ingredient
public abstract class Dough : Ingredient {}
public abstract class Sauce : Ingredient {}
public abstract class Cheese : Ingredient {}
public abstract class Pepperoni : Ingredient {}
public abstract class Clams : Ingredient {}
public class ThinCrustDough : Dough {}
public class MarinaraSauce : Sauce {}
public class ReggianoCheese : Cheese {}
public class FreshClams : Clams {}
public class NYPizzaIngredientFactory : PizzaIngredientFactory
public override Dough CreateDough()
return new ThinCrustDough();
public override Sauce CreateSauce()
return new MarinaraSauce();
public override Cheese CreateCheese()
return new ReggianoCheese();
public override Clams CreateClams()
public abstract class PizzaStore
public abstract Pizza OrderPizza(string type);
protected abstract Pizza CreatePizza(string type);
public class NYPizzaStore : PizzaStore
public override Pizza OrderPizza(string type)
pizza = CreatePizza(type);
protected override Pizza CreatePizza(string type)
PizzaIngredientFactory ingredientFactory = new NYPizzaIngredientFactory();
pizza = new NYCheesePizza(ingredientFactory);
pizza.SetName("New York Cheese Pizza");
public abstract class Pizza
protected List<string> toppings = new List<string>();
public abstract void Prepare();
public Cheese GetCheese()
Console.WriteLine("Bake for 25 minutes at 350 degrees.");
Console.WriteLine("Cutting the pizza into diagonal slices.");
Console.WriteLine("Place pizza in official Pizza Store Box.");
public void SetName(string name)
public class NYCheesePizza : Pizza
PizzaIngredientFactory ingredientFactory;
public NYCheesePizza(PizzaIngredientFactory ingredientFactory)
this.ingredientFactory = ingredientFactory;
public override void Prepare()
Console.WriteLine("Preparing " + this.GetName() + ".");
this.dough = ingredientFactory.CreateDough();
this.sauce = ingredientFactory.CreateSauce();
this.cheese = ingredientFactory.CreateCheese();