Creational Patterns
복잡한 객체를 단계별로 구성할 수 있는 Creational 디자인 패턴
➡️ 동일한 Builder 코드로 객체의 다양한 유형과 표현을 생성할 수 있다
많은 프로퍼티와 중첩된 객체를 가진 복잡한 객체는 초기화하는 과정 또한 복잡하다.
이런 경우 초기화 코드가 많은 매개변수를 가진 생성자에 파묻혀 있고, 더 나쁜 경우엔 클라이언트 코드 곧곧에 흩어져있기도 합니다.
예를 들어 House
라는 객체가 있다고 생각해봅시다.
간단하게 집을 지으려면 네 개의 벽과 창문, 그리고 지붕을 만들면 됩니다. 하지만 만약 마당이 있고, 난방 시스템을 가진 더 크고 멋진 집을 원한다면 어떨까요?
간단하게 해결하려면 House
클래스를 상속받는 하위 클래스를 만들면 됩니다. 그러나 다양한 집을 원하면 원할 수록 하위 클래스의 수는 어마어마해지고 새로운 요소를 원한다면 더더욱 깊은 계층이 필요하게 됩니다.
let newHouse = House(doors: 2, windows: 4, hasGarage: true, hasPool: true...)
모든 매개변수가 반드시 필요한 것이 아니기 때문에 위와 같은 생성자 호출은 보기에 지저분하게 됩니다.
Builder 패턴은 클래스에서 객체를 생성하는 코드를 분리하여 Builder라는 별도의 객체로 사용합니다.
Builder 패턴에서는 객체 생성을 일련의 구성 단계로 분리합니다.
ex) 벽 짓기, 문 만들기, 창문 만들기, 지붕 만들기...
중요한 것은 모든 단계를 호출할 필요가 없다는 점! 특정 개체를 생성하기 위해 필요한 단계만 호출 할 수 있습니다.
만약 표현 자체가 달라야 한다면 다양한 Builder를 생성할 수도 있습니다.
ex) 나무로된 집, 벽돌로 된 집, 유리로 된 집...
다양한 Builder들은 공통 인터페이스를 사용해 클라이언트와 상호 작용할 수 있어야 합니다.
Builder를 효율적으로 사용하기 위해 Director라는 별도의 클래스를 구현하여 사용할 수 있습니다.
Director는 빌더 단계에 대한 일련의 호출을 가지고 있어 특정 빌드를 호출할 수 있습니다.
반드시 Director가 필요한 것은 아니지만 다양한 구성 루틴을 구현하여 프로그램 전체에서 재사용할 수 있다는 장점이 있습니다. 또한 클라이언트는 Director만 알고 있고 빌더 내부를 완전히 숨길 수 있습니다.
참고 링크