정적 팩터리나 생성자는 같은 문제를 갖고 있다. 선택적 인자가 많은 상황에 잘 적응하지 못한다는 것. 예를들면, 영양 성분표를 나타내는 클래스가 있는 필수적인 항목은 몇가지 되지 않는다. 총 제공량 , 1회 제공량 , 1회 제공량당 칼로리 정도? 그러나 선택적인 항목은 엄청나게 많다. 지방함량율 , 나트륨 함량, 콜레스테롤 함량 등등.. 이러한 항목을 어떻게 표현할 수 있을까?

점층적 생성자 패턴

필수 인자만 받는 생성자를 하나 정의하고, 선택적 인자를 하나받는 생성자를 추가하고, 선택적인자 두가지를 받는 생성자를 추가하고...이와같은 반복적인 작업으로 수많은 항목을 표현하는 패턴. 인자가 많지 않을 때야 큰 문제없겠지만 인자가 늘어날 수록 곤란해질 것이다..
 즉, 점층적 생성자 패턴은 잘 동작하지만 인자 수가 늘어나면 클라이언트 코드를 작성하기 어려워지고, 가독성이 떨어진다.



자바빈 패턴

생성자에 전달되는 인자 수가 많을 때 적용 가능한 두 번째 대안이다. 인잔 없는 생성자를 호출하여 객체부터 만든 다음, 설정 메서드를 호출하여 필수 필드뿐 아니라 선택적 필드의 값들까지 채우는 것.


 그러나 자바빈 패턴에는 심각한 단점이 있다. 1회의 함수 호출로 객체 생성을 끝낼 수 없으므로, 객체 일관성이 일시적으로 깨질 수 있다.생성자의 인자가 유효한지 검사하여 일관성을 보장하는 단순한 방법을 여기서는 사용할 수 없다. 

   책에는 위와같이 적혀있는데 , 아래과 같이 인자가 유효한지 검사할 수 있지 않나..? 아마 책의 의도는 생성자 한곳에서 검사하지 않는 다는 말인 것같음.. 


 그리고 자바빈패턴에서는 변경 불가능한 클래스(생성자가 private)를 만들 수 없다.


빌더 패턴

빌더패턴은 점층적 생성자 패턴의 안전성과 과 자바빈 패턴의 가독성을 결합한 패턴이다. 필요한 객체를 직접 생성하는 대신, 클라이언트는 먼저 필수 인자들을 생성자에 전부 전달하여 빌더 객체를 만든 후, 빌더 객체에 정의된 설정 메서드들을 호출하여 선택적 인자들을 추가한 후 , build메서드를 통해 객체를 생성한다.

생성자와 마찬가지로 빌더 패턴을 사용하면 인자에 불변식을 적용할 수 있다. build메서드 안에서 해당 불변식이 위반되었는지 검사할 수 있는 것이다.


장점1. 작성하기도 쉽고, 가독성도 좋다.

생성자를 하나하나 만들어주지 않았기 때문에 코드를 작성하기도 쉽고, 가독성도 뛰어남.

장점2. 여러개의 선택적인 인자를 받을 수 있다.

생성자와 비교했을 때 빌더패턴은 선택적인 인자를 받을 수 있기때문에 유연한 코드작성이 가능하다.

단점1. 객체를 생성하려면 우선 빌더 객체를 생성해야 한다.

이는 성능이 우선이 되는 곳에서는 오버헤드가 발생할 여지가 있다.

요약

빌더 패턴은 인자가 많은 생성자나 정적 팩터리가 필요한 클래스를 설계할 때, 특히 대부분의 인자가 선택적 인자인 상황에 유용하다.



+ Recent posts