CS/디자인패턴

[디자인 패턴][생성 패턴] - 빌더 패턴

흰무 2023. 6. 19. 01:42

1. 빌더 패턴

복잡한 객체를 생성하는 방법을 정의하는 클래스와 표현하는 방법을 정의한 클래스를 별도로 분리해,
서로 다른 표현이더라도 이를 생성할 수 있는 동일한 절차를 제공하는 패턴
  • 사용하는 경우
    • 생성하는 객체가 Optional한 속성을 많이 가질 때 => 원하는 속성만 설정 가능
    • 생성하는 객체가 속성 값이 많을 때 => 체인 형식으로 설정/ 기본 값 사용 가능
  • 구현 방법

 

  1. Builder 클래스:
    • 객체의 생성과 속성 설정을 위한 메서드를 정의
    • 체인 형태로 메서드를 호출하여 객체의 속성을 설정
    • 일반적으로 객체의 각 속성에 대한 설정 메서드를 제공
  2. Director 클래스:
    • 객체 생성의 순서와 절차를 관리
    • Director 클래스는 빌더 객체를 받아서 원하는 순서로 메서드를 호출하여 객체를 생성
    • 객체 생성의 복잡한 절차를 Director 클래스가 관리하므로 클라이언트는 단순히 Director 객체를 사용하여 객체를 생성 가능
  3. Concrete Builder 클래스:
    • Builder 클래스를 구현한 실제 빌더 클래스
    • Builder 인터페이스를 구현하여 객체를 생성하고 설정하는 메서드를 구현
    • 각 속성에 대한 설정 메서드를 구현하여 객체의 속성을 설정
  4. 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());
    }
}

 

이상으로, 생성 패턴들을 모두 알아볼 수 있었다.

각 패턴 모두 사용하고 있던 것들이지만, 실제로 패턴을 구현해 보는 것은 다른 느낌이라는 것을 알 수 있었다.

다음부턴, 구조패턴에 대해서 알아보자