디자인패턴/생성패턴
Factory Method Pattern 팩토리 메소드 패턴 (feat. kotlin)
hik14
2024. 6. 2. 23:27
정의
Factory method는 부모(상위) 클래스에 알려지지 않은 구체 클래스를 생성하는 패턴이며. 자식(하위) 클래스가 어떤 객체를 생성할지를 결정하도록 하는 패턴이기도 하다. 부모(상위) 클래스 코드에 구체 클래스 이름을 감추기 위한 방법으로도 사용한다.
- 객체를 이용하는 코드로 부터 객체를 생성하는 코드를 분리하여, Loose Coupling(느슨한 결합)을 이루어낸다.
- 상속(inheritance)에 많이 의존합니다.
- 객체생성의 구현부를 하위 클래스에 위임.
장점
- 코드에서 작동할 정확한 객체의 Type을 모르는 경우 사용한다.
- 독립적으로 Product 생성 코드를 쉽게 확장할 수 있습니다.
- 기존의 코드를 수정하지 않고 새로운 product를 추가하는데 쉽다.
- product 생성코드를 한 곳에 모아 쉽게 관리할 수 있다.
Abstract Product Class
abstract class Pizza {
abstract val name: String
abstract val dough: String
abstract val sauce: String
val toppings: MutableList<String> = mutableListOf()
// Do Stuff
fun prepare() {
println("준비 중: $name")
println("도우를 돌리는 중...")
println("소스를 뿌리는 중...")
println("토핑을 올리는 중...")
toppings.forEach { topping ->
println("$topping topping")
}
println("완성!")
}
}
Concreate Product Class
class CheesePizza: Pizza(){
override val name: String = "치즈 피자"
override val dough: String = "씬 크러스트 도우"
override val sauce: String = "마리나라 소스"
init {
toppings.add("잘게 썬 레지아노 치즈")
}
}
class PepperoniPizza: Pizza(){
override val name: String = "페퍼로니 치즈 피자"
override val dough: String = "씬 크러스트 도우"
override val sauce: String = "마리나라 소스"
init {
toppings.add("통 페퍼로니")
}
}
Abstract Creator Class
abstract class PizzaStore {
// 어떤 피자던 주문하는 과정 및 포장 처리는 변함이 없다.
fun orderPizza(): Pizza {
val pizza = createPizza()
pizza.prepare()
return pizza
}
// Factory Method
// 피자의 종류에 따라 실제 어떤 피자를 생성하여 반환 할지는 하위 클래스에서 결정하기로 한다.
protected abstract fun createPizza(): Pizza
}
Concreate Creator Class
class PepperoniPizzaStore : PizzaStore() {
override fun createPizza(): Pizza =
PepperoniPizza()
}
class CheesePizzaStore : PizzaStore() {
override fun createPizza(): Pizza =
CheesePizza()
}