본문 바로가기
프로그래밍 놀이터/디자인 패턴, 리펙토링

[Effective Java] 생성자의 매개변수가 많을 때는 빌더(builder)를 고려하자.

by 돼지왕 왕돼지 2015. 2. 8.
반응형
생성자의 매개변수가 많을 때는 빌더(builder)를 고려하자.

-
static 팩토리 메소드와 생성자는 공통적 제약이 있다.
선택가능한 매개변수가 많아질 경우 신축성 있게 처리하지 못한다.


-
텔레스코핑 생성자(telescoping constructor) 패턴이 대안이 될 수 있으나,
마찬가지로 매개변수 수가 증가하면 무척 번거로워 진다.
가독성도 떨어지고, 유지보수도 어려워진다. ( 갯수를 세고 의미를 파악하는데만도 한세월~ )


-
자바빈즈(Java Beans) 패턴이 두번째 대안이 될 수 있으나,
이 패턴은 심각한 단점을 가지고 있다.
여러 번의 메소드 호출로 나누어져 인스턴스가 완성되기 때문에
객체가 일관된 상태를 유지하지 못할 수 있다. ( multi thread 환경 )
또한 자바빈즈는 불변 클래스를 만들 수 있는 가능성을 배제한다.


-
텔레스코핑의 안정성과 자바빈즈 패턴의 가독성을 짬뽕한 녀석이 빌더(builder) 패턴이다.
원하는 객체를 바로 생성하는 대신, 모든 필수 매개변수를 갖는 생성자를 호출하여 빌더객체를 얻는다.
그 다음 빌더 객체에 세터 메소드를 호출하여 선택 매개변수들의 값을 설정한다.
마지막으로 매개변수가 없는 build() 함수를 호출하여 불변객체를 생성한다.


-
빌더 패턴의 장점
    1. 작성이 쉽고, 가독성이 좋다.
    2. 여러 개의 가변인자(varargs) 매개변수를 가질 수 있다.
    생성자는 하나의 가변인자만 매개변수로 가질 수 있다.
    3. 유연성이 좋다.
    하나의 빌더로 값을 달리하며 여러개의 객체를 생성할 수 있다.
    객체가 생성될 때마다 count 를 올리는 등의 특수한 일도 할 수 있다.


-
generic 이 적용된 빌더는 훌륭한 추상 팩토리(abstract factory) 를 만든다.
추상 팩토리 빌더를 사용하면 유연성이 좋다.
생성할 때도 중복을 피할 수 있고,
매개변수로 사용할 때는 바운드 와일드 카드(bounded wild card) ( <? extends Node> ) 를 사용할 수 있다.


-
빌더 패턴의 단점
    1. 객체 생성하려면 그것의 빌더를 먼저 생성해야 한다.
    2. 성능이 중요한 상황에서는 문제가 될 수 있다.


-
빌더 패턴은 언제 적용하면 좋을까?
변수의 갯수가 4개 이상일 때 사용하면 좋다.
변수의 갯수가 계속 늘어날 가능이 있을 때 사용하면 좋다.

-
summary
    생성자나 static 팩토리 메소드에서 많은 매개변수를 갖게 될 클래스를 설계할 때는
    빌더 패턴이 좋은 선택이 될 수 있다.
    빌더 패턴은 텔레스코핑 생성자 패턴보다 가동성이 좋고, 자바빈즈 패턴보다 훨씬 안전하다.






반응형

댓글