# Factory Pattern (2) Abstract Factory Pattern
Assembled by GimunLee
ν©ν 리 λ©μλ ν¨ν΄κ³Ό μ΄μ΄μ§λ―λ‘, μ μ₯μ 미리 μ½κ³ μ€μλ κ²μ μΆμ²ν©λλ€.
# Goal
- Abstract Factory Patternμ κ°λ μ μ μ μλ€.
- Abstract Factory Patternμ λν΄ μ€λͺ ν μ μλ€.
- ν©ν 리 λ©μλ ν¨ν΄κ³Ό μΆμ ν©ν 리 ν¨ν΄μ μ°¨μ΄μ μ λν΄ μ€λͺ ν μ μλ€.
# νΌμκ°κ² λΆμ λ¬Έμ μ
κ° λΆμ μμ νΌμμ μ¬λ£λ₯Ό λ€λ₯Έ κ²μ μ¬μ©νκΈ° μμνμ΅λλ€. μ΄λ κ² μλ‘ λ€λ₯Έ μ’ λ₯μ μ¬λ£λ€μ μ 곡νκΈ° μν΄ μμ¬λ£κ΅°(families of ingredients)μ μ²λ¦¬ν λ°©λ²μ μκ°ν΄ λ΄μΌ ν©λλ€.
# λ¬Έμ μ
- λͺ¨λ νΌμλ κ°μ ꡬμ±μμλ‘ μ΄λ£¨μ΄μ§μ§λ§, μ§μλ§λ€ κ° κ΅¬μ±μμλ₯Ό λ€λ₯Έ λ°©μμΌλ‘ ꡬνν©λλ€.
- κ° κ΅°(family)μ νΉμ νμμ λ°μ£½, νΉμ νμμ μμ€, μΉμ¦ κ·Έλ¦¬κ³ ν΄μ°λ¬Ό ν νμΌλ‘ ꡬμ±λ©λλ€. (κ·Έ μΈμλ μΌμ±λ ν₯μ λ£ κ°μ μμν κ²λ€μ΄ μμ΅λλ€.)
- κ° λΆμ μ κ°κ°μ μμ¬λ£κ΅°μ μ΄λ£Ήλλ€. κ° μ§μλ§λ€ νΉμ νμμ μ¬λ£λ‘ ꡬμ±λλ κ΅°μ ꡬνν΄μΌν©λλ€.
# μμ¬λ£ 곡μ₯ λ§λ€κΈ°
μ΄μ μμ¬λ£λ₯Ό μμ°νκΈ° μν 곡μ₯μ λ§λ€μ΄ λ³΄κ² μ΅λλ€. μ΄ κ³΅μ₯μμλ μμ¬λ£κ΅°μ λ€μ΄μλ κ°κ°μ μμ¬λ£λ₯Ό μμ°ν©λλ€. μ¦, λ°μ£½, μμ€, μΉμ¦ κ°μ κ±Έ λ§λ€μ΄μΌ ν©λλ€.
μ°μ λͺ¨λ μμ¬λ£λ₯Ό μμ°ν ν©ν 리λ₯Ό μν μΈν°νμ΄μ€λ₯Ό μ μν΄λ³΄κ² μ΅λλ€.
- κ° μ¬λ£λ³ μμ± λ©μλλ₯Ό μ μν©λλ€.
- λͺ¨λ ν©ν 리 μΈμ€ν΄μ€μμ 곡ν΅μ μΌλ‘ μ¬μ©νλ λΆλΆμ΄ μλ€λ©΄ μΈν°νμ΄μ€κ° μλ μΆμν΄λμ€λ‘ λ§λ€μ΄λ λ©λλ€.
public interface PizzaIngredientFactory {
public Dough createDough();
public Sauce createSauce();
public Cheese createCheese();
public Veggies[] createVeggies();
public Pepperoni createPepperoni();
public Clams createClam();
}
λ΄μ₯ μμ¬λ£ 곡μ₯μ ꡬνν΄λ³΄κ² μ΅λλ€. μ΄ κ³΅μ₯μμλ λ§λ¦¬λλΌ μμ€, λ μ§μλ Έ μΉμ¦, μ μ ν μ‘°κ° λ±μ μ λ¬Έμ μΌλ‘ μμ°ν©λλ€.
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();
}
}
# νΌμ ν΄λμ€ λ³κ²½
ν©ν 리 μ€λΉκ° λλκ³ μ΄μ μ¬λ£λ₯Ό μμ°ν μ€λΉκ° λλ¬μ΅λλ€. Pizza ν΄λμ€μ ν©ν 리μμ μμ°ν μμ¬λ£λ§ μ¬μ©νλλ‘ μ½λλ₯Ό κ³ μ³μΌν©λλ€. μ°μ Pizza μΆμ ν΄λμ€μμ μμν΄λ³΄κ² μ΅λλ€.
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(){
// νΌμ μ΄λ¦μ μΆλ ₯νλ λΆλΆ
}
}
- prepare() λ©μλλ₯Ό μ μΈν λ€λ₯Έ λ©μλλ€μ λ°λμ§ μμ΅λλ€.
Pizza μΆμ ν΄λμ€ μ€λΉκ° λλ¬μΌλ λ΄μ₯ν νΌμμ μμΉ΄κ³ ν νΌμλ₯Ό λ§λ€μ΄μΌλ©λλ€. λ¬λΌμ§ μ μ μμ¬λ£λ₯Ό 곡μ₯μμ λ°λ‘ κ°μ Έμ¨λ€λ κ² λ°μ μμ΅λλ€.
ν©ν 리 λ©μλ ν¨ν΄μ μ΄μ©ν μ½λλ₯Ό λ§λ€μμ λ, λ€λ₯Έ νΌμ ν΄λμ€λ₯Ό μ΄ν΄λ³΄λ©΄ μ§μλ³λ‘ λ€λ₯Έ μ¬λ£λ₯Ό μ¬μ©νλ€λ κ²λ§ λΉΌλ©΄ λ€λ₯Έμ μ΄ μμ΅λλ€. νΌμλ₯Ό μ΄λ£¨λ κΈ°λ³Έ μμκ° λ°μ£½, μμ€, μΉμ¦λΌλ 건 λ§μ°¬κ°μ§λκΉμ. μΌμ± νΌμλ μ‘°κ° νΌμλ λ§μ°¬κ°μ§μ λλ€. μ¬λ£λ§ λ€λ₯Ό λΏ μ€λΉ λ¨κ³λ€μ λκ°μ΅λλ€.
λ°λΌμ νΌμλ§λ€ ν΄λμ€λ₯Ό μ§μλ³λ‘ λ§λ€ νμκ° μλ€λ κ²°λ‘ μ λ΄λ¦΄ μ μμ΅λλ€. μ§μλ³λ‘ λ€λ₯Έ μ μ μμ¬λ£ 곡μ₯μμ 컀λ²ν΄μ£ΌλκΉμ. μΉμ¦ νΌμ μ½λλ₯Ό ꡬνν΄λ³΄κ² μ΅λλ€.
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();
}
}
# μ¬λ°λ₯Έ μ¬λ£ 곡μ₯ μ¬μ©νκΈ°
νΌμ κ°κ²λ₯Ό λ€μ μ΄ν΄λ³΄κ² μ΅λλ€.
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;
}
}
ν©ν 리 λ©μλ ν¨ν΄μμ createPizza() λ©μλμ λΉκ΅ν΄λ³΄μκΈΈ λ°λλλ€.
# μ§κΈκΉμ§ ν κ±Έ μ λ¦¬ν΄ λ΄ μλ€.
μΆμ ν©ν 리(Abstract Factory)λΌκ³ λΆλ₯΄λ μλ‘μ΄ νμμ ν©ν 리λ₯Ό λμ ν΄μ μλ‘ λ€λ₯Έ νΌμμμ νμλ‘ νλ μμ¬λ£κ΅°μ μμ°νκΈ° μν λ°©λ²μ ꡬμΆνμ΅λλ€.
μΆμ ν©ν 리λ₯Ό ν΅ν΄μ μ νκ΅°μ μμ±νκΈ° μν μΈν°νμ΄μ€λ₯Ό μ 곡ν μ μμ΅λλ€. μ΄ μΈν°νμ΄μ€λ₯Ό μ΄μ©νλ μ½λλ₯Ό λ§λ€λ©΄ μ½λλ₯Ό μ νμ μμ°νλ μ€μ ν©ν 리μ λΆλ¦¬μν¬ μ μμ΅λλ€. μ΄λ κ² ν¨μΌλ‘μ¨ (μ§μ, μ΄μ체μ , 룩μ€ν λ±) μλ‘ λ€λ₯Έ μν©λ³λ‘ μ λΉν μ νμ μμ°ν μ μλ λ€μν ν©ν 리λ₯Ό ꡬνν μ μκ² λ©λλ€.
μ½λκ° μ€μ μ ννκ³ λΆλ¦¬λμ΄ μμΌλ―λ‘ λ€λ₯Έ 곡μ₯μ μ¬μ©νκΈ°λ§ νλ©΄ λ€λ₯Έ κ²°κ³Όλ₯Ό μ»μ μ μμ΅λλ€.
# μΆμ ν©ν 리 ν¨ν΄ μ μ
μ΄μ ν κ°μ§ ν©ν 리 ν¨ν΄μ λ λ°°μ μ΅λλ€. μ νκ΅°μ λ§λ€ λ μΈ μ μλ ν¨ν΄μ λλ€.
μΆμ ν©ν 리 ν¨ν΄ - μΆμ ν©ν 리 ν¨ν΄μμλ μΈν°νμ΄μ€λ₯Ό μ΄μ©νμ¬ μλ‘ μ°κ΄λ, λλ μμ‘΄νλ κ°μ²΄λ₯Ό ꡬμ ν΄λμ€λ₯Ό μ§μ νμ§ μκ³ λ μμ±ν μ μμ΅λλ€.
μΆμ ν©ν 리 ν¨ν΄μ μ¬μ©νλ©΄ ν΄λΌμ΄μΈνΈμμ μΆμ μΈν°νμ΄μ€λ₯Ό ν΅ν΄μ μΌλ ¨μ μ νλ€μ 곡κΈλ°μ μ μμ΅λλ€. μ΄λ, μ€μ λ‘ μ΄λ€ μ νμ΄ μμ°λλμ§λ μ ν μ νμλ μμ΅λλ€. λ°λΌμ ν΄λΌμ΄μΈνΈμ ν©ν 리μμ μμ°λλ μ νμ λΆλ¦¬μν¬ μ μμ΅λλ€.
ν΄λμ€ λ€μ΄μ΄κ·Έλ¨μ ν΅ν΄μ μ΄λ€ μμΌλ‘ λμκ°λμ§ μ΄ν΄λ΄ μλ€.
μ΄μ PizzaStoreκΉμ§ ν¬ν¨μμΌμ μ 체μ μΈ λ€μ΄μ΄κ·Έλ¨μ μ΄ν΄λ΄ μλ€.
μΆμ ν©ν 리 ν¨ν΄ λ€μλ ν©ν 리 λ©μλ ν¨ν΄μ΄ μ¨μ΄μλ 건κ°μ?
μΆμ ν©ν 리 ν¨ν΄μμ λ©μλκ° ν©ν 리 λ©μλλ‘ κ΅¬νλλ κ²½μ°λ μ’ μ’ μμ΅γ΄λγ . μΆμ ν¨ν λ¦¬κ° μλ μΌλ ¨μ μ νλ€μ μμ±νλ λ° μ°μΌ μΈν°νμ΄μ€λ₯Ό μ μνκΈ° μν΄ λ§λ€μ΄μ§ κ±°λκΉμ. κ·Έ μΈν°νμ΄μ€μ μλ κ° λ©μλλ ꡬμ μ νμ μμ°νλ μΌμ λ§‘κ³ μκ³ , μΆμ ν©ν 리μ μλΈν΄λμ€λ₯Ό λ§λ€μ΄μ κ° λ©μλμ ꡬνμ μ 곡ν©λλ€. λ°λΌμ μΆμ ν©ν 리 ν¨ν΄μμ μ νμ μμ°νκΈ° μν λ©μλλ₯Ό ꡬννλ λ° μμ΄μ ν©ν 리 λ©μλλ₯Ό μ¬μ©νλ κ²μ λ무λλ μμ°μ€λ¬μ΄ μΌμ λλ€.
# ν΄λμ€ λ€μ΄μ΄κ·Έλ¨ λΉκ΅
# ν©ν 리 λ©μλ ν¨ν΄
# μΆμ ν©ν 리 ν¨ν΄
# References
- Head First Design Patterns