우리는 객체를 생성함으로써 코드를 만들어 나갑니다.
하지만, 문제가 있습니다.
→ new를 통해 만들어진 객체를 변경하거나 확장해야할 때, 우리는 코드를 다시 확인하고 추가/제거 해야합니다.
→ 이런 식으로 코드를 만들면 관리 및 갱신이 어려워지고 오류가 생길 가능성이 높아집니다..!
바뀔 수 있는 부분을 찾아내서 바뀌지 않는 부분하고 분리시킵시다!
fun orderPizza(type: String): Pizza {
lateinit var pizza : Pizza
// 이 부분은 맨날 바뀌어야 하는 부분. 새로운 메뉴가 나오거나 메뉴가 삭제된다면 해당 코드는 매일 변합니다.
if(type == "cheese") {
pizza = CheesePizza()
} else if(type == "greek") {
pizza = GreekPizza()
} else if(type == "pepperoni") {
pizza = PepperoniPizza()
}
/* 추가될 수도 있습니다!
else if(type == "clam") {
pizza = new ClamPizza()
}
*/
// 여기는 무슨 짓을 하더라도 피자가 준비되고, 배달되기 위해서는 필요한 부분.
pizza.prepare()
pizza.bake()
pizza.cut()
pizza.box()
return pizza
}
class PizzaStore(val factory: SimplePizzaFactory) {
fun orderPizza(type: String): Pizza {
pizza = factory.createPizza(type)
pizza.prepare()
pizza.bake()
pizza.cut()
pizza.box()
}
}
class SimplePizzaFactory {
fun createPizza(type: String): Pizza {
lateinit var pizza: Pizza
if(type == "cheese") {
pizza = CheesePizza()
}
} else if(type == "greek") {
pizza = GreekPizza()
}
} else if(type == "pepperoni") {
pizza = PepperoniPizza()
}
return pizza
}
}
모든 팩토리 패턴에서는 객체 생성을 캡슐화합니다!
**서브클래스(의 메서드)**에서 어떤 클래스를 만들지 결정하게 함으로써(== 맡기는 것) 객체 생성을 캡슐화합니다!