728x90
반응형
빌더 패턴이란
빌더 패턴은 복잡한 객체의 생성 과정과 표현 방법을 분리하여,
동일한 생성 과정에서 서로 다른 표현 결과를 얻을 수 있도록 하는 생성 디자인 패턴입니다.
빌더 패턴의 구성
GOF 가 설명하는 빌더 패턴은 주로 다음 네 가지 구성 요소로 이루어져 있습니다
- Builder: 객체의 생성 과정을 추상화한 인터페이스.
- ConcreteBuilder: Builder 인터페이스의 구현체로, 객체의 실제 생성을 담당.
- Director: Builder를 사용해 객체를 생성하는 클래스.
- Product: 최종적으로 생성되는 객체.
빌더패턴 다이어그램
예제: 커피주문 시스템
// Product 클래스
public class Coffee {
private final String type;
private final boolean milk;
private final boolean sugar;
public Coffee(String type, boolean milk, boolean sugar) {
this.type = type;
this.milk = milk;
this.sugar = sugar;
}
@Override
public String toString() {
return "Coffee{" +
"type='" + type + '\'' +
", milk=" + milk +
", sugar=" + sugar +
'}';
}
}
// Builder 인터페이스
public interface CoffeeBuilder {
CoffeeBuilder coffeeType(String type);
CoffeeBuilder milk(boolean milk);
CoffeeBuilder sugar(boolean sugar);
Coffee build();
}
// ConcreteBuilder 클래스
public class StarbucksCoffeeBuilder implements CoffeeBuilder {
private String type = "에스프레소";
private boolean milk = false;
private boolean sugar = false;
@Override
public CoffeeBuilder coffeeType(String type) {
this.type = type;
return this;
}
@Override
public CoffeeBuilder milk(boolean milk) {
this.milk = milk;
return this;
}
@Override
public CoffeeBuilder sugar(boolean sugar) {
this.sugar = sugar;
return this;
}
// 이 부분이 핵심
@Override
public Coffee build() {
return new Coffee(type, milk, sugar);
}
}
// Director 클래스
public class CoffeeDirector {
private CoffeeBuilder builder;
public CoffeeDirector(CoffeeBuilder builder) {
this.builder = builder;
}
public Coffee orderAmericano() {
builder.coffeeType("아메리카노");
builder.milk(false);
builder.sugar(false);
return builder.build();
}
}
// Client 클래스
public class Main {
public static void main(String[] args) {
// 1. StarbucksCoffeeBuilder 직접 사용
CoffeeBuilder builder = new StarbucksCoffeeBuilder();
Coffee coffee = builder.coffeeType("라떼")
.milk(true)
.sugar(false)
.build();
// 커스텀 커피
System.out.println(coffee);
// 2. 디렉터를 통해서 커피를 뽑아내보자
CoffeeBuilder coffeeBuilder = new StarbucksCoffeeBuilder();
CoffeeDirector director = new CoffeeDirector(coffeeBuilder);
Coffee directorCoffee = director.orderAmericano();
// 디렉터로 만든 템플릿커피
System.out.println(directorCoffee);
}
}
예제를 쭉 복사해서 만든 후, 다이어그램을 보며 왔다갔다하면서 살펴보시면 이해가 되실겁니다.
저는 실무에서 lombok의 @Builder 애노테이션으로 빌더패턴을 많이 사용합니다.
말나온김에 스프링 MVC쪽 빌더패턴 적용 예제를 간단하게 보여드리겠습니다.
// ResponseEntity 빌더
@RestController
public class MyController {
@GetMapping("/example")
public ResponseEntity<String> getExample() {
return ResponseEntity.ok()
.header("Custom-Header", "value")
.body("Hello, World!");
}
}
실무사용 예
스프링 MVC에서 HTTP 응답을 구성할 때 ResponseEntity의 빌더를 사용합니다.
이를 통해 상태 코드, 헤더, 바디 등을 유연하게 설정할 수 있습니다.
결론
빌더패턴
1. 복잡한 객체의 생성 과정을 단순화해주고 유연성이 확보된다.
2. 덕분에 가독성이 확보된다.
3. 필요한 데이터만 설정하여 생성가능
4. 생성과 표현코드를 분리해준다.
참고자료
GOF 디자인패턴 책
728x90
반응형
'디자인패턴' 카테고리의 다른 글
[디자인패턴-구조] 어댑터 패턴: 음악플레이어 예제를 통한 GOF 디자인 패턴의 이해 (WITH 자바) (0) | 2024.02.16 |
---|---|
[디자인패턴-생성] 싱글톤 패턴: 싱글톤 인스턴스 생성의 3가지 방법 (WITH 자바) (0) | 2024.02.13 |
[디자인패턴-생성] 프로토타입 패턴: 문서 템플릿 예제를 통한 GOF 디자인 패턴의 이해 (WITH 자바) (0) | 2024.02.12 |
[디자인패턴-생성] 추상팩토리 패턴: 가구 예제를 통한 GOF 디자인 패턴의 이해 (WITH 자바) (1) | 2024.02.12 |
[디자인패턴-생성] 팩토리메서드 패턴: 커피 예제를 통한 GOF 디자인 패턴의 이해(WITH 자바) (0) | 2024.02.10 |