디자인패턴/생성패턴

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()
}