우리는 객체를 생성함으로써 코드를 만들어 나갑니다.

하지만, 문제가 있습니다.

→ 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
    }
}

장점

뭔가 부족한데...?

알아가기

모든 팩토리 패턴에서는 객체 생성을 캡슐화합니다!


팩토리 메서드 패턴

**서브클래스(의 메서드)**에서 어떤 클래스를 만들지 결정하게 함으로써(== 맡기는 것) 객체 생성을 캡슐화합니다!