빌더 패턴이란?
빌더 패턴은 복잡한 객체를 단계적으로 생성할 수 있도록 도와주는 디자인 패턴입니다. 특히 많은 옵션이나 매개변수를 가진 객체를 만들 때 유용합니다. 일반적인 생성자는 매개변수가 많아지면 복잡해지기 때문에, 빌더 패턴은 각 단계에서 선택적인 매개변수를 추가할 수 있게 해줍니다.
햄버거 예제와 빌더 패턴
햄버거를 주문할 때, 특정 업체에서는 다양한 재료 중에서 자신만의 햄버거를 만들 수 있습니다. 먼저 빵과 패티 같은 필수 재료를 선택하고, 그다음으로 치즈, 양상추, 토마토 같은 선택적인 재료를 추가합니다. 이 과정은 빌더 패턴과 매우 유사합니다.
필수 요소와 선택 요소
- 필수 요소: 햄버거를 만들기 위해선 반드시 있어야 하는 재료가 있습니다. 예를 들어, 빵과 패티는 꼭 필요한 요소입니다. 빌더 패턴에서는 객체를 만들기 위한 필수 요소를 생성자를 통해 전달합니다.
- 선택 요소: 필수 요소 외에도 고객이 추가할 수 있는 여러 선택적인 재료가 있습니다. 치즈, 토마토, 양상추는 꼭 있어야 하는 건 아니지만, 원할 경우 추가할 수 있습니다. 빌더 패턴에서는 이런 선택적인 요소들을 메서드로 추가할 수 있습니다.
package builder;
// 햄버거 클래스 : 빌더 패턴을 사용해 단계적으로 객체를 생성
public class Burger {
// 필수요소와 선택적 요소가 있을 수 있다.
private String bread;
private String patty;
private boolean cheese;
private boolean tomato;
private boolean lettuce;
// 외부에서 직접 생성하지 못하도록 - private 생성자 선언
// 내부 정적 클래스에서 생성된 상태값들을 받아 멥버 변수를 추기화 한다.
private Burger(BurgerBuilder builder ) {
this.bread = builder.bread;
this.patty = builder.patty;
this.cheese = builder.cheese;
this.tomato = builder.tomato;
this.lettuce = builder.lettuce;
}
// 반드시 정적 내부 클래스를 선언한다.
public static class BurgerBuilder {
private String bread;
private String patty;
private boolean cheese = false;
private boolean tomato = false;
private boolean lettuce = false;
// 필수 매개변수를 받을 생성자를 설계한다.
public BurgerBuilder(String bread, String patty) {
this.bread = bread;
this.patty = patty;
}
// 선택적 요소를 단계적으로 추가할 수 있도록 메서드를 설계해 준다.
public BurgerBuilder addCheese() {
this.cheese = true;
return this; // 메서드 체이닝 지원
}
public BurgerBuilder addTomato() {
this.tomato = true;
return this; // 메서드 체이닝 지원
}
public BurgerBuilder addLettuce() {
this.lettuce = true;
return this; // 메서드 체이닝 지원
}
// 핵심 1 - 최종적으로 Burger 객체를 반환하는 메서드를 생성(만들어 준다)
public Burger build() {
return new Burger(this);
}
} // end of inner class
@Override
public String toString() {
return "Burger [bread=" + bread + ", patty=" + patty + ", cheese=" + cheese + ", tomato=" + tomato
+ ", lettuce=" + lettuce + "]";
}
}
package builder;
public class BurgerStore {
public static void main(String[] args) {
Burger burger1 = new Burger.BurgerBuilder("부드러운빵", "소고기")
.addCheese()
.addTomato()
.build();
System.out.println(burger1);
System.out.println("---------");
Burger 치즈와양상추버거 = new Burger.BurgerBuilder("빵", "닭고기")
.addLettuce().addTomato().build();
System.out.println(치즈와양상추버거);
}
}
요약
즉 빌더 패턴은 복잡한 객체를 단계적으로 생성할 수 있도록 도와주는 디자인 패턴입니다.
'Spring boot > 개념 공부' 카테고리의 다른 글
어댑터 패턴 (2) | 2024.09.27 |
---|---|
팩토리 패턴 (0) | 2024.09.27 |
싱글 톤 패턴 (2) | 2024.09.27 |
콜백 메서드 만들어 보기 (1) (0) | 2024.09.27 |
디자인 패턴 (0) | 2024.09.27 |