팩토리 메소드 패턴 (Factory Metgo Pattern)
특징
- 어떤 구상 클래스가 생성되는지 상관 없이 로직을 구현할 수 있다.
- 자식 클래스에게 객체 생성 책임을 부여한다.
- 런타임에 어느 구상 객체가 생성되는지 결정하지는 않는다.
다이어그램
팩토리 메소드 패턴 예제
추상 팩토리 패턴 (Abstract Factory Pattern)
장점
- 클라이언트와 구상 클래스 구현을 분리시킵니다.
- 제품군을 쉽게 바꿀 수 있다.
- 일관된 제품군 인터페이스를 제공한다.
단점
- 새로운 제품군을 수정하기가 어렵다.
다이어그램
객체지향 원칙
의존성 뒤집기 원칙 (Dependency Inversion Principle)
예제 코드
간단한 팩토리 예제
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | package pizzas; import java.util.ArrayList; abstract public class Pizza { String name; String dough; String sauce; ArrayList<String> toppings = new ArrayList<String>(); public String getName() { return name; } public void prepare() { System.out.println("Preparing " + name); } public void bake() { System.out.println("Baking " + name); } public void cut() { System.out.println("Cutting " + name); } public void box() { System.out.println("Boxing " + name); } public String toString() { // code to display pizza name and ingredients StringBuffer display = new StringBuffer(); display.append("---- " + name + " ----\n"); display.append(dough + "\n"); display.append(sauce + "\n"); for (String topping : toppings) { display.append(topping + "\n"); } return display.toString(); } } | cs |
- pizzas/CheesePizza.java
1 2 3 4 5 6 7 8 9 10 11 12 | package pizzas; public class CheesePizza extends Pizza { public CheesePizza() { name = "Cheese Pizza"; dough = "Regular Crust"; sauce = "Marinara Pizza Sauce"; toppings.add("Fresh Mozzarella"); toppings.add("Parmesan"); } } | cs |
- pizzas/ClamPizza.java
1 2 3 4 5 6 7 8 9 10 11 12 | package pizzas; public class ClamPizza extends Pizza { public ClamPizza() { name = "Clam Pizza"; dough = "Thin crust"; sauce = "White garlic sauce"; toppings.add("Clams"); toppings.add("Grated parmesan cheese"); } } | cs |
- pizzas/PepperoniPizza.java
1 2 3 4 5 6 7 8 9 10 11 12 13 | package pizzas; public class PepperoniPizza extends Pizza { public PepperoniPizza() { name = "Pepperoni Pizza"; dough = "Crust"; sauce = "Marinara sauce"; toppings.add("Sliced Pepperoni"); toppings.add("Sliced Onion"); toppings.add("Grated parmesan cheese"); } } | cs |
- pizzas/VeggiePizza.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | package pizzas; public class VeggiePizza extends Pizza { public VeggiePizza() { name = "Veggie Pizza"; dough = "Crust"; sauce = "Marinara sauce"; toppings.add("Shredded mozzarella"); toppings.add("Grated parmesan"); toppings.add("Diced onion"); toppings.add("Sliced mushrooms"); toppings.add("Sliced red pepper"); toppings.add("Sliced black olives"); } } | cs |
- pizzas/SimplePizzaFactory.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | package pizzas; public class SimplePizzaFactory { public Pizza createPizza(String type) { Pizza pizza = null; if (type.equals("cheese")) { pizza = new CheesePizza(); } else if (type.equals("pepperoni")) { pizza = new PepperoniPizza(); } else if (type.equals("clam")) { pizza = new ClamPizza(); } else if (type.equals("veggie")) { pizza = new VeggiePizza(); } return pizza; } } | cs |
- pizzas/PizzaStore.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | package pizzas; public class PizzaStore { SimplePizzaFactory factory; public PizzaStore(SimplePizzaFactory factory) { this.factory = factory; } public Pizza orderPizza(String type) { Pizza pizza; pizza = factory.createPizza(type); pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box(); return pizza; } } | cs |
- pizzas/PizzaTestDrive.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | package pizzas; public class PizzaTestDrive { public static void main(String[] args) { SimplePizzaFactory factory = new SimplePizzaFactory(); PizzaStore store = new PizzaStore(factory); Pizza pizza = store.orderPizza("cheese"); System.out.println("We ordered a " + pizza.getName() + "\n"); System.out.println(pizza); pizza = store.orderPizza("veggie"); System.out.println("We ordered a " + pizza.getName() + "\n"); System.out.println(pizza); } } | cs |
팩토리 메소드 패턴
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | package pizzafm; import java.util.ArrayList; public abstract class Pizza { String name; String dough; String sauce; ArrayList<String> toppings = new ArrayList<String>(); void prepare() { System.out.println("Prepare " + name); System.out.println("Tossing dough..."); System.out.println("Adding sauce..."); System.out.println("Adding toppings: "); for (String topping : toppings) { System.out.println(" " + topping); } } void bake() { System.out.println("Bake for 25 minutes at 350"); } void cut() { System.out.println("Cut the pizza into diagonal slices"); } void box() { System.out.println("Place pizza in official PizzaStore box"); } 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 (String topping : toppings) { display.append(topping + "\n"); } return display.toString(); } } | cs |
- pizzafm/PizzaStore.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | package pizzafm; public abstract class PizzaStore { abstract Pizza createPizza(String item); public Pizza orderPizza(String type) { Pizza pizza = createPizza(type); System.out.println("--- Making a " + pizza.getName() + " ---"); pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box(); return pizza; } } | cs |
- pizzafm/ChicagoStyleCheesePizza.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | package pizzafm; 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"); } void cut() { System.out.println("Cutting the pizza into square slices"); } } | cs |
- pizzafm/ChicagoStyleClamPizza.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | package pizzafm; 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"); } void cut() { System.out.println("Cutting the pizza into square slices"); } } | cs |
- pizzafm/ChicagoStylePepperoniPizza.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | package pizzafm; 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"); } void cut() { System.out.println("Cutting the pizza into square slices"); } } | cs |
- pizzafm/ChicagoStyleVeggiePizza.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | package pizzafm; 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"); } void cut() { System.out.println("Cutting the pizza into square slices"); } } | cs |
- pizzafm/ChicagoPizzaStore.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | package pizzafm; 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; } } | cs |
- pizzafm/NYStyleCheesePizza.java
1 2 3 4 5 6 7 8 9 10 11 12 13 | package pizzafm; 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"); } } | cs |
- pizzafm/NYStyleClamPizza.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | package pizzafm; 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"); } } | cs |
- pizzafm/NYStylePepperoniPizza.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | package pizzafm; 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"); } } | cs |
- pizzafm/NYStyleVeggiePizza.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | package pizzafm; 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"); } } | cs |
- pizzafm/NYPizzaStore.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | package pizzafm; public class NYPizzaStore extends PizzaStore { Pizza createPizza(String item) { if (item.equals("cheese")) { return new NYStyleCheesePizza(); } else if (item.equals("veggie")) { return new NYStyleVeggiePizza(); } else if (item.equals("clam")) { return new NYStyleClamPizza(); } else if (item.equals("pepperoni")) { return new NYStylePepperoniPizza(); } else return null; } } | cs |
- pizzafm/PizzaTestDrive.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | package pizzafm; public class PizzaTestDrive { public static void main(String[] args) { PizzaStore nyStore = new NYPizzaStore(); PizzaStore chicagoStore = new ChicagoPizzaStore(); Pizza pizza = nyStore.orderPizza("cheese"); System.out.println("Ethan ordered a " + pizza.getName() + "\n"); pizza = chicagoStore.orderPizza("cheese"); System.out.println("Joel ordered a " + pizza.getName() + "\n"); pizza = nyStore.orderPizza("clam"); System.out.println("Ethan ordered a " + pizza.getName() + "\n"); pizza = chicagoStore.orderPizza("clam"); System.out.println("Joel ordered a " + pizza.getName() + "\n"); pizza = nyStore.orderPizza("pepperoni"); System.out.println("Ethan ordered a " + pizza.getName() + "\n"); pizza = chicagoStore.orderPizza("pepperoni"); System.out.println("Joel ordered a " + pizza.getName() + "\n"); pizza = nyStore.orderPizza("veggie"); System.out.println("Ethan ordered a " + pizza.getName() + "\n"); pizza = chicagoStore.orderPizza("veggie"); System.out.println("Joel ordered a " + pizza.getName() + "\n"); } } | cs |
- pizzafm/DependentPizzaStore.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | package pizzafm; public class DependentPizzaStore { public Pizza createPizza(String style, String type) { Pizza pizza = null; if (style.equals("NY")) { if (type.equals("cheese")) { pizza = new NYStyleCheesePizza(); } else if (type.equals("veggie")) { pizza = new NYStyleVeggiePizza(); } else if (type.equals("clam")) { pizza = new NYStyleClamPizza(); } else if (type.equals("pepperoni")) { pizza = new NYStylePepperoniPizza(); } } else if (style.equals("Chicago")) { if (type.equals("cheese")) { pizza = new ChicagoStyleCheesePizza(); } else if (type.equals("veggie")) { pizza = new ChicagoStyleVeggiePizza(); } else if (type.equals("clam")) { pizza = new ChicagoStyleClamPizza(); } else if (type.equals("pepperoni")) { pizza = new ChicagoStylePepperoniPizza(); } } else { System.out.println("Error: invalid type of pizza"); return null; } pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box(); return pizza; } } | cs |
추상 팩토리 패턴
1 2 3 4 5 6 | package pizzaaf; public interface Dough { public String toString(); } | cs |
- pizzaaf/ThickCrustDough.java
1 2 3 4 5 6 7 8 | package pizzaaf; public class ThickCrustDough implements Dough { public String toString() { return "ThickCrust style extra thick crust dough"; } } | cs |
- pizzaaf/ThinCrustDough.java
1 2 3 4 5 6 7 8 | package pizzaaf; public class ThinCrustDough implements Dough { public String toString() { return "Thin Crust Dough"; } } | cs |
- pizzaaf/Clams.java
1 2 3 4 5 6 | package pizzaaf; public interface Clams { public String toString(); } | cs |
- pizzaaf/FrozenClams.java
1 2 3 4 5 6 7 8 9 | package pizzaaf; public class FrozenClams implements Clams { public String toString() { return "Frozen Clams from Chesapeake Bay"; } } | cs |
- pizzaaf/FreshClams.java
1 2 3 4 5 6 7 8 9 | package pizzaaf; public class FreshClams implements Clams { public String toString() { return "Fresh Clams from Long Island Sound"; } } | cs |
- pizzaaf/Sauce.java
1 2 3 4 5 6 | package pizzaaf; public interface Sauce { public String toString(); } | cs |
- pizzaaf/PlumTomatoSauce.java
1 2 3 4 5 6 7 8 | package pizzaaf; public class PlumTomatoSauce implements Sauce { public String toString() { return "Tomato sauce with plum tomatoes"; } } | cs |
- pizzaaf/MarinaraSauce.java
1 2 3 4 5 6 7 8 | package pizzaaf; public class MarinaraSauce implements Sauce { public String toString() { return "Marinara Sauce"; } } | cs |
- pizzaaf/Cheese.java
1 2 3 4 5 6 | package pizzaaf; public interface Cheese { public String toString(); } | cs |
- pizzaaf/MozzarellaCheese.java
1 2 3 4 5 6 7 8 9 | package pizzaaf; public class MozzarellaCheese implements Cheese { public String toString() { return "Shredded Mozzarella"; } } | cs |
- pizzaaf/ReggianoCheese.java
1 2 3 4 5 6 7 8 9 | package pizzaaf; public class ReggianoCheese implements Cheese { public String toString() { return "Reggiano Cheese"; } } | cs |
- pizzaaf/ParmesanCheese.java
1 2 3 4 5 6 7 8 9 | package pizzaaf; public class ParmesanCheese implements Cheese { public String toString() { return "Shredded Parmesan"; } } | cs |
- pizzaaf/Pepperoni.java
1 2 3 4 5 6 | package pizzaaf; public interface Pepperoni { public String toString(); } | cs |
- pizzaaf/SlicedPepperoni.java
1 2 3 4 5 6 7 8 9 | package pizzaaf; public class SlicedPepperoni implements Pepperoni { public String toString() { return "Sliced Pepperoni"; } } | cs |
- pizzaaf/Veggies.java
1 2 3 4 5 6 | package pizzaaf; public interface Veggies { public String toString(); } | cs |
- pizzaaf/BlackOlives.java
1 2 3 4 5 6 7 8 9 | package pizzaaf; public class BlackOlives implements Veggies { public String toString() { return "Black Olives"; } } | cs |
- pizzaaf/Eggplant.java
1 2 3 4 5 6 7 8 9 | package pizzaaf; public class Eggplant implements Veggies { public String toString() { return "Eggplant"; } } | cs |
- pizzaaf/Garlic.java
1 2 3 4 5 6 7 8 9 | package pizzaaf; public class Garlic implements Veggies { public String toString() { return "Garlic"; } } | cs |
- pizzaaf/Mushroom.java
1 2 3 4 5 6 7 8 9 | package pizzaaf; public class Mushroom implements Veggies { public String toString() { return "Mushrooms"; } } | cs |
- pizzaaf/Onion.java
1 2 3 4 5 6 7 8 9 | package pizzaaf; public class Onion implements Veggies { public String toString() { return "Onion"; } } | cs |
- pizzaaf/RedPepper.java
1 2 3 4 5 6 7 8 9 | package pizzaaf; public class RedPepper implements Veggies { public String toString() { return "Red Pepper"; } } | cs |
- pizzaaf/Spinach.java
1 2 3 4 5 6 7 8 9 | package pizzaaf; public class Spinach implements Veggies { public String toString() { return "Spinach"; } } | cs |
- pizzaaf/PizzaIngredientFactory.java
1 2 3 4 5 6 7 8 9 10 11 12 13 | package pizzaaf; public interface PizzaIngredientFactory { public Dough createDough(); public Sauce createSauce(); public Cheese createCheese(); public Veggies[] createVeggies(); public Pepperoni createPepperoni(); public Clams createClam(); } | cs |
- pizzaaf/NYPizzaIngredientFactory.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | package pizzaaf; 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(); } } | cs |
- pizzaaf/ChicagoPizzaIngredientFactory.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | package pizzaaf; 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(); } } | cs |
- pizzaaf/Pizza.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | package pizzaaf; public abstract class Pizza { String name; Dough dough; Sauce sauce; Veggies veggies[]; Cheese cheese; Pepperoni pepperoni; Clams clam; abstract void prepare(); void bake() { System.out.println("Bake for 25 minutes at 350"); } void cut() { System.out.println("Cutting the pizza into diagonal slices"); } void box() { System.out.println("Place pizza in official PizzaStore box"); } void setName(String name) { this.name = name; } String getName() { return name; } public String toString() { 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"); } 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(); } } | cs |
- pizzaaf/CheesePizza.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | package pizzaaf; public class CheesePizza extends Pizza { PizzaIngredientFactory ingredientFactory; public CheesePizza(PizzaIngredientFactory ingredientFactory) { this.ingredientFactory = ingredientFactory; } void prepare() { System.out.println("Preparing " + name); dough = ingredientFactory.createDough(); sauce = ingredientFactory.createSauce(); cheese = ingredientFactory.createCheese(); } } | cs |
- pizzaaf/ClamPizza.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | package pizzaaf; public class ClamPizza extends Pizza { PizzaIngredientFactory ingredientFactory; public ClamPizza(PizzaIngredientFactory ingredientFactory) { this.ingredientFactory = ingredientFactory; } void prepare() { System.out.println("Preparing " + name); dough = ingredientFactory.createDough(); sauce = ingredientFactory.createSauce(); cheese = ingredientFactory.createCheese(); clam = ingredientFactory.createClam(); } } | cs |
- pizzaaf/PepperoniPizza.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | package pizzaaf; public class PepperoniPizza extends Pizza { PizzaIngredientFactory ingredientFactory; public PepperoniPizza(PizzaIngredientFactory ingredientFactory) { this.ingredientFactory = ingredientFactory; } void prepare() { System.out.println("Preparing " + name); dough = ingredientFactory.createDough(); sauce = ingredientFactory.createSauce(); cheese = ingredientFactory.createCheese(); veggies = ingredientFactory.createVeggies(); pepperoni = ingredientFactory.createPepperoni(); } } | cs |
- pizzaaf/VeggiePizza.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | package pizzaaf; public class VeggiePizza extends Pizza { PizzaIngredientFactory ingredientFactory; public VeggiePizza(PizzaIngredientFactory ingredientFactory) { this.ingredientFactory = ingredientFactory; } void prepare() { System.out.println("Preparing " + name); dough = ingredientFactory.createDough(); sauce = ingredientFactory.createSauce(); cheese = ingredientFactory.createCheese(); veggies = ingredientFactory.createVeggies(); } } | cs |
- pizzaaf/PizzaStore.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | package pizzaaf; public abstract class PizzaStore { protected abstract Pizza createPizza(String item); public Pizza orderPizza(String type) { Pizza pizza = createPizza(type); System.out.println("--- Making a " + pizza.getName() + " ---"); pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box(); return pizza; } } | cs |
- pizzaaf/NYPizzaStore.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | package pizzaaf; public class NYPizzaStore extends PizzaStore { protected Pizza createPizza(String item) { Pizza pizza = null; PizzaIngredientFactory ingredientFactory = new NYPizzaIngredientFactory(); if (item.equals("cheese")) { pizza = new CheesePizza(ingredientFactory); pizza.setName("New York Style Cheese Pizza"); } else if (item.equals("veggie")) { pizza = new VeggiePizza(ingredientFactory); pizza.setName("New York Style Veggie Pizza"); } else if (item.equals("clam")) { pizza = new ClamPizza(ingredientFactory); pizza.setName("New York Style Clam Pizza"); } else if (item.equals("pepperoni")) { pizza = new PepperoniPizza(ingredientFactory); pizza.setName("New York Style Pepperoni Pizza"); } return pizza; } } | cs |
- pizzaaf/ChicagoPizzaStore.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | package pizzaaf; public class ChicagoPizzaStore extends PizzaStore { 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; } } | cs |
- pizzaaf/PizzaTestDrive.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | package pizzaaf; public class PizzaTestDrive { public static void main(String[] args) { PizzaStore nyStore = new NYPizzaStore(); PizzaStore chicagoStore = new ChicagoPizzaStore(); Pizza pizza = nyStore.orderPizza("cheese"); System.out.println("Ethan ordered a " + pizza + "\n"); pizza = chicagoStore.orderPizza("cheese"); System.out.println("Joel ordered a " + pizza + "\n"); pizza = nyStore.orderPizza("clam"); System.out.println("Ethan ordered a " + pizza + "\n"); pizza = chicagoStore.orderPizza("clam"); System.out.println("Joel ordered a " + pizza + "\n"); pizza = nyStore.orderPizza("pepperoni"); System.out.println("Ethan ordered a " + pizza + "\n"); pizza = chicagoStore.orderPizza("pepperoni"); System.out.println("Joel ordered a " + pizza + "\n"); pizza = nyStore.orderPizza("veggie"); System.out.println("Ethan ordered a " + pizza + "\n"); pizza = chicagoStore.orderPizza("veggie"); System.out.println("Joel ordered a " + pizza + "\n"); } } | cs |
'자바 > 자바 자료실' 카테고리의 다른 글
[디자인 패턴] 06. 커맨드 패턴 (Command Pattern) (0) | 2018.10.23 |
---|---|
[디자인 패턴] 05. 싱글턴 패턴 (Singleton Pattern) (0) | 2018.10.23 |
[디자인패턴] 03. 데코레이터 패턴 (Decorator Pattern) (0) | 2018.10.22 |
[디자인패턴] 02. 옵저버 패턴 (Observer Pattern) (0) | 2018.10.19 |
[디자인패턴] 01. 스트래티지 패턴 (Strategy Pattern) (0) | 2018.10.19 |
댓글