CS/디자인패턴
[디자인 패턴][생성 패턴] - 빌더 패턴
흰무
2023. 6. 19. 01:42
1. 빌더 패턴
복잡한 객체를 생성하는 방법을 정의하는 클래스와 표현하는 방법을 정의한 클래스를 별도로 분리해,
서로 다른 표현이더라도 이를 생성할 수 있는 동일한 절차를 제공하는 패턴
- 사용하는 경우
- 생성하는 객체가 Optional한 속성을 많이 가질 때 => 원하는 속성만 설정 가능
- 생성하는 객체가 속성 값이 많을 때 => 체인 형식으로 설정/ 기본 값 사용 가능
- 구현 방법
- Builder 클래스:
- 객체의 생성과 속성 설정을 위한 메서드를 정의
- 체인 형태로 메서드를 호출하여 객체의 속성을 설정
- 일반적으로 객체의 각 속성에 대한 설정 메서드를 제공
- Director 클래스:
- 객체 생성의 순서와 절차를 관리
- Director 클래스는 빌더 객체를 받아서 원하는 순서로 메서드를 호출하여 객체를 생성
- 객체 생성의 복잡한 절차를 Director 클래스가 관리하므로 클라이언트는 단순히 Director 객체를 사용하여 객체를 생성 가능
- Concrete Builder 클래스:
- Builder 클래스를 구현한 실제 빌더 클래스
- Builder 인터페이스를 구현하여 객체를 생성하고 설정하는 메서드를 구현
- 각 속성에 대한 설정 메서드를 구현하여 객체의 속성을 설정
- Product 클래스:
- 빌더 패턴을 통해 생성된 최종 객체
- 빌더를 통해 설정된 속성을 보유
- 빌더 패턴을 사용하여 생성된 객체는 Product 클래스의 인스턴스로 반환
- 예시
## Product 클래스
public class Pizza {
private String dough;
private String sauce;
private String topping;
public Pizza(String dough, String sauce, String topping) {
this.dough = dough;
this.sauce = sauce;
this.topping = topping;
}
public String getDescription() {
return "이 피자는" + dough + "도우, " + sauce + " 소스, 그리고 " + topping + " 토핑으로 구성되었습니다.";
}
}
## Builder 인터페이스
public interface PizzaBuilder {
void buildDough();
void buildSauce();
void buildTopping();
Pizza getPizza();
}
## Concrete Builder 클래스
public class MargheritaPizzaBuilder implements PizzaBuilder {
private String dough;
private String sauce;
private String topping;
@Override
public void buildDough() {
dough = "씬";
}
@Override
public void buildSauce() {
sauce = "토마토";
}
@Override
public void buildTopping() {
topping = "치즈";
}
@Override
public Pizza getPizza() {
return new Pizza(dough, sauce, topping);
}
}
## Director 클래스
public class PizzaDirector {
private PizzaBuilder builder;
public PizzaDirector(PizzaBuilder builder) {
this.builder = builder;
}
public void constructPizza() {
builder.buildDough();
builder.buildSauce();
builder.buildTopping();
}
}
## Main
public class Main {
public static void main(String[] args) {
// Builder 객체 생성
PizzaBuilder builder = new MargheritaPizzaBuilder();
// Director 객체 생성
PizzaDirector director = new PizzaDirector(builder);
// Director를 통한 피자 생성
director.constructPizza();
Pizza pizza = builder.getPizza();
System.out.println(pizza.getDescription());
}
}
이상으로, 생성 패턴들을 모두 알아볼 수 있었다.
각 패턴 모두 사용하고 있던 것들이지만, 실제로 패턴을 구현해 보는 것은 다른 느낌이라는 것을 알 수 있었다.
다음부턴, 구조패턴에 대해서 알아보자