From 9db3842cfb6c42fda90d6fdae0eec29f7ae2719b Mon Sep 17 00:00:00 2001
From: Peter Hertkorn <peter.hertkorn@reutlingen-university.de>
Date: Thu, 12 Nov 2020 21:41:18 +0100
Subject: [PATCH] Using abstract factory for pizza ingredients

---
 .../ChicagoPizzaIngredientFactory.java        | 33 ++++++++
 .../ingredients/NYPizzaIngredientFactory.java | 29 +++++++
 .../ingredients/PizzaIngredientFactory.java   | 12 +++
 src/pizzeria/pizza/CheesePizza.java           | 17 ++++
 .../pizza/ChicagoStyleCheesePizza.java        | 16 ----
 src/pizzeria/pizza/ChicagoStyleClamPizza.java | 16 ----
 .../pizza/ChicagoStylePepperoniPizza.java     | 19 -----
 .../pizza/ChicagoStyleVeggiePizza.java        | 18 -----
 src/pizzeria/pizza/ClamPizza.java             | 18 +++++
 src/pizzeria/pizza/NYStyleCheesePizza.java    | 12 ---
 src/pizzeria/pizza/NYStyleClamPizza.java      | 13 ---
 src/pizzeria/pizza/NYStylePepperoniPizza.java | 17 ----
 src/pizzeria/pizza/NYStyleVeggiePizza.java    | 16 ----
 .../PepperoniPizza.java                       |  6 +-
 src/pizzeria/pizza/Pizza.java                 | 79 ++++++++++++-------
 src/pizzeria/pizza/VeggiePizza.java           | 18 +++++
 src/pizzeria/store/ChicagoPizzaStore.java     | 39 ++++++---
 src/pizzeria/store/NYPizzaStore.java          | 34 ++++++--
 src/pizzeria/store/PizzaStore.java            |  4 +-
 19 files changed, 239 insertions(+), 177 deletions(-)
 create mode 100644 src/pizzeria/ingredients/ChicagoPizzaIngredientFactory.java
 create mode 100644 src/pizzeria/ingredients/NYPizzaIngredientFactory.java
 create mode 100644 src/pizzeria/ingredients/PizzaIngredientFactory.java
 create mode 100644 src/pizzeria/pizza/CheesePizza.java
 delete mode 100644 src/pizzeria/pizza/ChicagoStyleCheesePizza.java
 delete mode 100644 src/pizzeria/pizza/ChicagoStyleClamPizza.java
 delete mode 100644 src/pizzeria/pizza/ChicagoStylePepperoniPizza.java
 delete mode 100644 src/pizzeria/pizza/ChicagoStyleVeggiePizza.java
 create mode 100644 src/pizzeria/pizza/ClamPizza.java
 delete mode 100644 src/pizzeria/pizza/NYStyleCheesePizza.java
 delete mode 100644 src/pizzeria/pizza/NYStyleClamPizza.java
 delete mode 100644 src/pizzeria/pizza/NYStylePepperoniPizza.java
 delete mode 100644 src/pizzeria/pizza/NYStyleVeggiePizza.java
 rename src/pizzeria/{ingredients => pizza}/PepperoniPizza.java (81%)
 create mode 100644 src/pizzeria/pizza/VeggiePizza.java

diff --git a/src/pizzeria/ingredients/ChicagoPizzaIngredientFactory.java b/src/pizzeria/ingredients/ChicagoPizzaIngredientFactory.java
new file mode 100644
index 0000000..7a3a3c7
--- /dev/null
+++ b/src/pizzeria/ingredients/ChicagoPizzaIngredientFactory.java
@@ -0,0 +1,33 @@
+package pizzeria.ingredients;
+
+public class ChicagoPizzaIngredientFactory 
+	implements PizzaIngredientFactory 
+{
+
+	public Dough createDough() {
+		return new ThickCrustDough();
+	}
+
+	public Sauce createSauce() {
+		return new PlumTomatoSauce();
+	}
+
+	public Cheese createCheese() {
+		return new MozzarellaCheese();
+	}
+
+	public Veggies[] createVeggies() {
+		Veggies veggies[] = { new BlackOlives(), 
+		                      new Spinach(), 
+		                      new Eggplant() };
+		return veggies;
+	}
+
+	public Pepperoni createPepperoni() {
+		return new SlicedPepperoni();
+	}
+
+	public Clams createClam() {
+		return new FrozenClams();
+	}
+}
diff --git a/src/pizzeria/ingredients/NYPizzaIngredientFactory.java b/src/pizzeria/ingredients/NYPizzaIngredientFactory.java
new file mode 100644
index 0000000..6e1e8fc
--- /dev/null
+++ b/src/pizzeria/ingredients/NYPizzaIngredientFactory.java
@@ -0,0 +1,29 @@
+package pizzeria.ingredients;
+
+public class NYPizzaIngredientFactory implements PizzaIngredientFactory {
+ 
+	public Dough createDough() {
+		return new ThinCrustDough();
+	}
+ 
+	public Sauce createSauce() {
+		return new MarinaraSauce();
+	}
+ 
+	public Cheese createCheese() {
+		return new ReggianoCheese();
+	}
+ 
+	public Veggies[] createVeggies() {
+		Veggies veggies[] = { new Garlic(), new Onion(), new Mushroom(), new RedPepper() };
+		return veggies;
+	}
+ 
+	public Pepperoni createPepperoni() {
+		return new SlicedPepperoni();
+	}
+
+	public Clams createClam() {
+		return new FreshClams();
+	}
+}
diff --git a/src/pizzeria/ingredients/PizzaIngredientFactory.java b/src/pizzeria/ingredients/PizzaIngredientFactory.java
new file mode 100644
index 0000000..e1240c1
--- /dev/null
+++ b/src/pizzeria/ingredients/PizzaIngredientFactory.java
@@ -0,0 +1,12 @@
+package pizzeria.ingredients;
+
+public interface PizzaIngredientFactory {
+ 
+	public Dough createDough();
+	public Sauce createSauce();
+	public Cheese createCheese();
+	public Veggies[] createVeggies();
+	public Pepperoni createPepperoni();
+	public Clams createClam();
+ 
+}
diff --git a/src/pizzeria/pizza/CheesePizza.java b/src/pizzeria/pizza/CheesePizza.java
new file mode 100644
index 0000000..6d2bd8f
--- /dev/null
+++ b/src/pizzeria/pizza/CheesePizza.java
@@ -0,0 +1,17 @@
+package pizzeria.pizza;
+
+import pizzeria.ingredients.PizzaIngredientFactory;
+
+public class CheesePizza extends Pizza {
+ 
+	public CheesePizza(PizzaIngredientFactory ingredientFactory) {
+		this.ingredientFactory = ingredientFactory;
+	}
+ 
+	public void prepare() {
+		System.out.println("Preparing " + name);
+		dough = ingredientFactory.createDough();
+		sauce = ingredientFactory.createSauce();
+		cheese = ingredientFactory.createCheese();
+	}
+}
diff --git a/src/pizzeria/pizza/ChicagoStyleCheesePizza.java b/src/pizzeria/pizza/ChicagoStyleCheesePizza.java
deleted file mode 100644
index c37121c..0000000
--- a/src/pizzeria/pizza/ChicagoStyleCheesePizza.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package pizzeria.pizza;
-
-public class ChicagoStyleCheesePizza extends Pizza {
-
-	public ChicagoStyleCheesePizza() { 
-		name = "Chicago Style Deep Dish Cheese Pizza";
-		dough = "Extra Thick Crust Dough";
-		sauce = "Plum Tomato Sauce";
- 
-		toppings.add("Shredded Mozzarella Cheese");
-	}
- 
-	public void cut() {
-		System.out.println("Cutting the pizza into square slices");
-	}
-}
diff --git a/src/pizzeria/pizza/ChicagoStyleClamPizza.java b/src/pizzeria/pizza/ChicagoStyleClamPizza.java
deleted file mode 100644
index c5bae96..0000000
--- a/src/pizzeria/pizza/ChicagoStyleClamPizza.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package pizzeria.pizza;
-
-public class ChicagoStyleClamPizza extends Pizza {
-	public ChicagoStyleClamPizza() {
-		name = "Chicago Style Clam Pizza";
-		dough = "Extra Thick Crust Dough";
-		sauce = "Plum Tomato Sauce";
- 
-		toppings.add("Shredded Mozzarella Cheese");
-		toppings.add("Frozen Clams from Chesapeake Bay");
-	}
- 
-	public void cut() {
-		System.out.println("Cutting the pizza into square slices");
-	}
-}
diff --git a/src/pizzeria/pizza/ChicagoStylePepperoniPizza.java b/src/pizzeria/pizza/ChicagoStylePepperoniPizza.java
deleted file mode 100644
index ae37b1f..0000000
--- a/src/pizzeria/pizza/ChicagoStylePepperoniPizza.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package pizzeria.pizza;
-
-public class ChicagoStylePepperoniPizza extends Pizza {
-	public ChicagoStylePepperoniPizza() {
-		name = "Chicago Style Pepperoni Pizza";
-		dough = "Extra Thick Crust Dough";
-		sauce = "Plum Tomato Sauce";
- 
-		toppings.add("Shredded Mozzarella Cheese");
-		toppings.add("Black Olives");
-		toppings.add("Spinach");
-		toppings.add("Eggplant");
-		toppings.add("Sliced Pepperoni");
-	}
- 
-	public void cut() {
-		System.out.println("Cutting the pizza into square slices");
-	}
-}
diff --git a/src/pizzeria/pizza/ChicagoStyleVeggiePizza.java b/src/pizzeria/pizza/ChicagoStyleVeggiePizza.java
deleted file mode 100644
index 546b168..0000000
--- a/src/pizzeria/pizza/ChicagoStyleVeggiePizza.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package pizzeria.pizza;
-
-public class ChicagoStyleVeggiePizza extends Pizza {
-	public ChicagoStyleVeggiePizza() {
-		name = "Chicago Deep Dish Veggie Pizza";
-		dough = "Extra Thick Crust Dough";
-		sauce = "Plum Tomato Sauce";
- 
-		toppings.add("Shredded Mozzarella Cheese");
-		toppings.add("Black Olives");
-		toppings.add("Spinach");
-		toppings.add("Eggplant");
-	}
- 
-	public void cut() {
-		System.out.println("Cutting the pizza into square slices");
-	}
-}
diff --git a/src/pizzeria/pizza/ClamPizza.java b/src/pizzeria/pizza/ClamPizza.java
new file mode 100644
index 0000000..6ab93ea
--- /dev/null
+++ b/src/pizzeria/pizza/ClamPizza.java
@@ -0,0 +1,18 @@
+package pizzeria.pizza;
+
+import pizzeria.ingredients.PizzaIngredientFactory;
+
+public class ClamPizza extends Pizza {
+ 
+	public ClamPizza(PizzaIngredientFactory ingredientFactory) {
+		this.ingredientFactory = ingredientFactory;
+	}
+ 
+	public void prepare() {
+		System.out.println("Preparing " + name);
+		dough = ingredientFactory.createDough();
+		sauce = ingredientFactory.createSauce();
+		cheese = ingredientFactory.createCheese();
+		clam = ingredientFactory.createClam();
+	}
+}
diff --git a/src/pizzeria/pizza/NYStyleCheesePizza.java b/src/pizzeria/pizza/NYStyleCheesePizza.java
deleted file mode 100644
index ac5055d..0000000
--- a/src/pizzeria/pizza/NYStyleCheesePizza.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package pizzeria.pizza;
-
-public class NYStyleCheesePizza extends Pizza {
-
-	public NYStyleCheesePizza() { 
-		name = "NY Style Sauce and Cheese Pizza";
-		dough = "Thin Crust Dough";
-		sauce = "Marinara Sauce";
- 
-		toppings.add("Grated Reggiano Cheese");
-	}
-}
diff --git a/src/pizzeria/pizza/NYStyleClamPizza.java b/src/pizzeria/pizza/NYStyleClamPizza.java
deleted file mode 100644
index b6635b0..0000000
--- a/src/pizzeria/pizza/NYStyleClamPizza.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package pizzeria.pizza;
-
-public class NYStyleClamPizza extends Pizza {
-
-	public NYStyleClamPizza() {
-		name = "NY Style Clam Pizza";
-		dough = "Thin Crust Dough";
-		sauce = "Marinara Sauce";
- 
-		toppings.add("Grated Reggiano Cheese");
-		toppings.add("Fresh Clams from Long Island Sound");
-	}
-}
diff --git a/src/pizzeria/pizza/NYStylePepperoniPizza.java b/src/pizzeria/pizza/NYStylePepperoniPizza.java
deleted file mode 100644
index f036f68..0000000
--- a/src/pizzeria/pizza/NYStylePepperoniPizza.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package pizzeria.pizza;
-
-public class NYStylePepperoniPizza extends Pizza {
-
-	public NYStylePepperoniPizza() {
-		name = "NY Style Pepperoni Pizza";
-		dough = "Thin Crust Dough";
-		sauce = "Marinara Sauce";
- 
-		toppings.add("Grated Reggiano Cheese");
-		toppings.add("Sliced Pepperoni");
-		toppings.add("Garlic");
-		toppings.add("Onion");
-		toppings.add("Mushrooms");
-		toppings.add("Red Pepper");
-	}
-}
diff --git a/src/pizzeria/pizza/NYStyleVeggiePizza.java b/src/pizzeria/pizza/NYStyleVeggiePizza.java
deleted file mode 100644
index e3d5247..0000000
--- a/src/pizzeria/pizza/NYStyleVeggiePizza.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package pizzeria.pizza;
-
-public class NYStyleVeggiePizza extends Pizza {
-
-	public NYStyleVeggiePizza() {
-		name = "NY Style Veggie Pizza";
-		dough = "Thin Crust Dough";
-		sauce = "Marinara Sauce";
- 
-		toppings.add("Grated Reggiano Cheese");
-		toppings.add("Garlic");
-		toppings.add("Onion");
-		toppings.add("Mushrooms");
-		toppings.add("Red Pepper");
-	}
-}
diff --git a/src/pizzeria/ingredients/PepperoniPizza.java b/src/pizzeria/pizza/PepperoniPizza.java
similarity index 81%
rename from src/pizzeria/ingredients/PepperoniPizza.java
rename to src/pizzeria/pizza/PepperoniPizza.java
index 9345487..aace5f5 100644
--- a/src/pizzeria/ingredients/PepperoniPizza.java
+++ b/src/pizzeria/pizza/PepperoniPizza.java
@@ -1,4 +1,6 @@
-package pizzeria.ingredients;
+package pizzeria.pizza;
+
+import pizzeria.ingredients.PizzaIngredientFactory;
 
 public class PepperoniPizza extends Pizza {
  
@@ -6,7 +8,7 @@ public class PepperoniPizza extends Pizza {
 		this.ingredientFactory = ingredientFactory;
 	}
  
-	void prepare() {
+	public void prepare() {
 		System.out.println("Preparing " + name);
 		dough = ingredientFactory.createDough();
 		sauce = ingredientFactory.createSauce();
diff --git a/src/pizzeria/pizza/Pizza.java b/src/pizzeria/pizza/Pizza.java
index 191fc04..e23062a 100644
--- a/src/pizzeria/pizza/Pizza.java
+++ b/src/pizzeria/pizza/Pizza.java
@@ -1,50 +1,73 @@
 package pizzeria.pizza;
 
-import java.util.ArrayList;
+import pizzeria.ingredients.PizzaIngredientFactory;
+import pizzeria.ingredients.*;
 
 public abstract class Pizza {
+	PizzaIngredientFactory ingredientFactory;
 	String name;
-	String dough;
-	String sauce;
-	ArrayList<String> toppings = new ArrayList<String>();
- 
-	public void prepare() {
-		System.out.println("Preparing " + name);
-		System.out.println("Tossing dough...");
-		System.out.println("Adding sauce...");
-		System.out.println("Adding toppings: ");
-		for (int i = 0; i < toppings.size(); i++) {
-			System.out.println("   " + toppings.get(i));
-		}
-	}
-  
+
+	Dough dough;
+	Sauce sauce;
+	Veggies veggies[];
+	Cheese cheese;
+	Pepperoni pepperoni;
+	Clams clam;
+
+	public abstract void prepare();
+
 	public void bake() {
 		System.out.println("Bake for 25 minutes at 350");
 	}
- 
+
 	public void cut() {
 		System.out.println("Cutting the pizza into diagonal slices");
 	}
-  
+
 	public void box() {
 		System.out.println("Place pizza in official PizzaStore box");
 	}
- 
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
 	public String getName() {
 		return name;
 	}
 
 	public String toString() {
-		StringBuffer display = new StringBuffer();
-		display.append("---- " + name + " ----\n");
-		display.append(dough + "\n");
-		display.append(sauce + "\n");
-		for (int i = 0; i < toppings.size(); i++) {
-			display.append((String )toppings.get(i) + "\n");
+		StringBuffer result = new StringBuffer();
+		result.append("---- " + name + " ----\n");
+		if (dough != null) {
+			result.append(dough);
+			result.append("\n");
+		}
+		if (sauce != null) {
+			result.append(sauce);
+			result.append("\n");
+		}
+		if (cheese != null) {
+			result.append(cheese);
+			result.append("\n");
 		}
-		return display.toString();
+		if (veggies != null) {
+			for (int i = 0; i < veggies.length; i++) {
+				result.append(veggies[i]);
+				if (i < veggies.length-1) {
+					result.append(", ");
+				}
+			}
+			result.append("\n");
+		}
+		if (clam != null) {
+			result.append(clam);
+			result.append("\n");
+		}
+		if (pepperoni != null) {
+			result.append(pepperoni);
+			result.append("\n");
+		}
+		return result.toString();
 	}
 }
-
- 
- 
diff --git a/src/pizzeria/pizza/VeggiePizza.java b/src/pizzeria/pizza/VeggiePizza.java
new file mode 100644
index 0000000..bf65a93
--- /dev/null
+++ b/src/pizzeria/pizza/VeggiePizza.java
@@ -0,0 +1,18 @@
+package pizzeria.pizza;
+
+import pizzeria.ingredients.PizzaIngredientFactory;
+
+public class VeggiePizza extends Pizza {
+ 
+	public VeggiePizza(PizzaIngredientFactory ingredientFactory) {
+		this.ingredientFactory = ingredientFactory;
+	}
+ 
+	public void prepare() {
+		System.out.println("Preparing " + name);
+		dough = ingredientFactory.createDough();
+		sauce = ingredientFactory.createSauce();
+		cheese = ingredientFactory.createCheese();
+		veggies = ingredientFactory.createVeggies();
+	}
+}
diff --git a/src/pizzeria/store/ChicagoPizzaStore.java b/src/pizzeria/store/ChicagoPizzaStore.java
index b3518a9..6b1a7e6 100644
--- a/src/pizzeria/store/ChicagoPizzaStore.java
+++ b/src/pizzeria/store/ChicagoPizzaStore.java
@@ -1,18 +1,37 @@
 package pizzeria.store;
 
+import pizzeria.ingredients.ChicagoPizzaIngredientFactory;
+import pizzeria.ingredients.PizzaIngredientFactory;
 import pizzeria.pizza.*;
 
 public class ChicagoPizzaStore extends PizzaStore {
 
-	Pizza createPizza(String item) {
-        	if (item.equals("cheese")) {
-            		return new ChicagoStyleCheesePizza();
-        	} else if (item.equals("veggie")) {
-        	    	return new ChicagoStyleVeggiePizza();
-        	} else if (item.equals("clam")) {
-        	    	return new ChicagoStyleClamPizza();
-        	} else if (item.equals("pepperoni")) {
-            		return new ChicagoStylePepperoniPizza();
-        	} else return null;
+	protected Pizza createPizza(String item) {
+		Pizza pizza = null;
+		PizzaIngredientFactory ingredientFactory =
+		new ChicagoPizzaIngredientFactory();
+
+		if (item.equals("cheese")) {
+
+			pizza = new CheesePizza(ingredientFactory);
+			pizza.setName("Chicago Style Cheese Pizza");
+
+		} else if (item.equals("veggie")) {
+
+			pizza = new VeggiePizza(ingredientFactory);
+			pizza.setName("Chicago Style Veggie Pizza");
+
+		} else if (item.equals("clam")) {
+
+			pizza = new ClamPizza(ingredientFactory);
+			pizza.setName("Chicago Style Clam Pizza");
+
+		} else if (item.equals("pepperoni")) {
+
+			pizza = new PepperoniPizza(ingredientFactory);
+			pizza.setName("Chicago Style Pepperoni Pizza");
+
+		}
+		return pizza;
 	}
 }
diff --git a/src/pizzeria/store/NYPizzaStore.java b/src/pizzeria/store/NYPizzaStore.java
index 301ffcb..f20a415 100644
--- a/src/pizzeria/store/NYPizzaStore.java
+++ b/src/pizzeria/store/NYPizzaStore.java
@@ -1,19 +1,37 @@
 package pizzeria.store;
 
+import pizzeria.ingredients.NYPizzaIngredientFactory;
+import pizzeria.ingredients.PizzaIngredientFactory;
 import pizzeria.pizza.*;
 
 public class NYPizzaStore extends PizzaStore {
-
-	Pizza createPizza(String item) {
+ 
+	protected Pizza createPizza(String item) {
+		Pizza pizza = null;
+		PizzaIngredientFactory ingredientFactory =
+			new NYPizzaIngredientFactory();
+ 
 		if (item.equals("cheese")) {
-			return new NYStyleCheesePizza();
+  
+			pizza = new CheesePizza(ingredientFactory);
+			pizza.setName("New York Style Cheese Pizza");
+  
 		} else if (item.equals("veggie")) {
-			return new NYStyleVeggiePizza();
+ 
+			pizza = new VeggiePizza(ingredientFactory);
+			pizza.setName("New York Style Veggie Pizza");
+ 
 		} else if (item.equals("clam")) {
-			return new NYStyleClamPizza();
+ 
+			pizza = new ClamPizza(ingredientFactory);
+			pizza.setName("New York Style Clam Pizza");
+ 
 		} else if (item.equals("pepperoni")) {
-			return new NYStylePepperoniPizza();
-		} else return null;
+
+			pizza = new PepperoniPizza(ingredientFactory);
+			pizza.setName("New York Style Pepperoni Pizza");
+ 
+		} 
+		return pizza;
 	}
-	
 }
diff --git a/src/pizzeria/store/PizzaStore.java b/src/pizzeria/store/PizzaStore.java
index c683329..9fbd594 100644
--- a/src/pizzeria/store/PizzaStore.java
+++ b/src/pizzeria/store/PizzaStore.java
@@ -4,9 +4,9 @@ import pizzeria.pizza.Pizza;
 
 public abstract class PizzaStore {
  
-	abstract Pizza createPizza(String item);
+	protected abstract Pizza createPizza(String item);
  
-	public final Pizza orderPizza(String type) {
+	public Pizza orderPizza(String type) {
 		Pizza pizza = createPizza(type);
 		System.out.println("--- Making a " + pizza.getName() + " ---");
 		pizza.prepare();
-- 
GitLab