생성자 단점
- 매개변수가 많아지면 코드를 읽기 어렵고, 어떤 순서로 매개변수 넣어야하는지 헷갈린다.
자바빈즈 패턴의 단점(JavaBeans pattern) - setter
- 개념
- 하나의 객체를 만들려고 메서드를 여러개 호출해야함 (코드 길어짐)
- 객체가 완전히 생성되기 전까지는 일관성(consisitency)가 무너진 상태가 됨(미완성) ⇒ 디버깅 어려움
빌더 패턴
public class PizzaExample {
public static void main(String[] args) {
NyPizza pizza = new NyPizza.Builder(SMALL).addTopping(Pizza.Topping.SAUSAGE).addTopping(Pizza.Topping.ONION).build();
Calzone cal = new Calzone.Builder().addTopping(HAM).sauceInside().build();
}
}
- 빌더의 세터 메서드 들은 빌더 자신을 반환하기 때문에 연쇄적으로 호출 가능
- 계층적으로 설계된 클래스와 함께 쓰기 좋다
- (코드참고) Pizza의 하위 클래스들의 빌더가 정의한 build 메서드는 상위클래스인 Pizza에서 정한 타입을 리턴하는것이 아니라 하위 클래스에서 정한 타입으로 반환
- (코드 참고) NyPizza.Builder는 NyPizza를 반환하고, Calzone.Builder는 Calzone을 반환
- 즉, 상속받은 Class의 Builder가 정의한 build 메서드가 상위 메서드의 타입을 return 하는 것이 아닌 자신의 타입을 return
- 유연한 코드, 확장성 확보
- 단점
- Builder를 항상 만들어야 하기 때문에 생성비용이 무조건 생김
- 점층적 생성자 패턴(Argument를 여러개 가진 Constructor) 보다 장황하여 적은 갯수의 Parameter일 경우 오히려 좋지 않을 수 있다.
Lombok을 사용하면 훨씬 더 Simple해질 수 있음
- 필수값 을 지정할 수 있음
- default 값을 지정할 수 있음