개발에 AtoZ까지

[디자인패턴] Builder Pattern 본문

백엔드/JAVA

[디자인패턴] Builder Pattern

AtoZ 개발자 2021. 6. 30. 23:36
반응형

◆목표

Builder 패턴이란?
Builder 패턴 사용법
정리


1. Builder 패턴이란?

빌더 패턴(Builder pattern)이란 복합 객체의 생성 과정과 표현 방법을 분리하여 동일한 생성 절차에서 서로 다른 표현 결과를 만들 수 있게 하는 패턴이다. -위키백과사전-

빌더 패턴도 추상 팩토리 패턴이나 팩토리 메소드 패턴과 비슷하게 새로운 객체를 만들어서 반환하는 패턴인데 실제 동작방법은 위의 2가지와는 다르게 동작합니다.

기본적으로 빌더패턴은 생성자에 들어갈 매개 변수를 차례차례 받아들여서 모든 매개변수를 받은 뒤에 이 변수들을 통합해서 한번에 객체를 생성하는 방식입니다. 실제 형태는 아래와 같습니다.

public class BuilderPattern {
    public static void main(String[] args) {
        // 빌더 객체를 하나 만듭니다.
        PersonInfoBuilder personInfoBuilder = new PersonInfoBuilder();
        PersonInfo result = personInfoBuilder
                .setName("MISTAKE")
                .setAge(20)
                .setFavoriteAnimal("cat")
                .setFavoriteColor("black")
                .setFavoriteNumber(7)
                .build();
        System.out.println(result.getPersonInfo());
    }
}

2. Builder 패턴 사용법

package Builder;

public class Cart {
    private String snack;
    private String drinking;
    private String clothes;

    public Cart(String snack, String drinking, String clothes) {
        this.snack = snack;
        this.drinking = drinking;
        this.clothes = clothes;
    }

    @Override
    public String toString() {
        return "Cart{" +
                "snack='" + snack + '\'' +
                ", drinking='" + drinking + '\'' +
                ", clothes='" + clothes + '\'' +
                '}';
    }

    public static class Builder{
        private String snack;
        private String drinking;
        private String clothes;

        public Builder setSnack(String snack){
            this.snack = snack;
            return this;
        }
        public Builder setDrinking(String drinking){
            this.drinking = drinking;
            return this;
        }
        public Builder setClothes(String clothes){
            this.clothes = clothes;
            return this;
        }

        public Cart build(){
            Cart cart = new Cart(this.snack,this.drinking,this.clothes);
            return cart;
        }
    }
}

위의 코드는 Cart 클래스, Builder 클래스 구현부입니다. Cart 클래스안에 Builder 클래스가 있지만 사실 둘의 관계는 builder가 static 키워드를 가짐으로써 무관합니다. 이제 Builder 클래스를 자세히 보시면 Cart에 선언된 변수를 똑같이 가지고 있습니다. 이 변수의 setter 함수와 setter 함수를 활용하여 Cart 객체를 생성해주는 build() 메소드로 구성되어 있습니다.

package Builder;

public class Main {
    public static void main(String[] args) {
        Cart cart = new Cart.Builder()
                .setClothes("바지")
                .setDrinking("맥주")
                .setSnack("칸쵸")
                .build();
    }
}

이렇게 Cart 클래스와 Builder 클래스를 활용하는 방법은 Builder 클래스를 활용할 수 있도록 인스턴스화 시키고 각 변수의 setter 함수를 호출합니다. 호출후에는 입력받은 정보를 가지고 Cart라는 클래스를 생성해주는 build() 메소드를 호출해줍니다.

3. 정리

일단 이렇게 Builder 패턴을 사용하는 이유는 아래의 3가지 이유 때문이라고 생각합니다.

  1. 다수의 생성자를 만들지 않고 객체를 만들 수 있다. (생성자 오버로딩 방지)

    public Cart(String snack) {
            this.snack = snack;
        }
    
        public Cart(String snack, String drinking) {
            this.snack = snack;
            this.drinking = drinking;
        }
    
        public Cart(String snack, String drinking, String clothes) {
            this.snack = snack;
            this.drinking = drinking;
            this.clothes = clothes;
        }​
  1. 데이터의 순서에 상관없이 객체를 만들수 있다.

        //생성자의 파라미터 순서대로 값을 입력해줘야지만 의도한대로 객체가 생성된다.
        public Cart(String snack) {
            this.snack = snack;
        }
    
        public Cart(String snack, String drinking) {
            this.snack = snack;
            this.drinking = drinking;
        }
    
    
    public Cart(String snack, String drinking, String clothes) {
        this.snack = snack;
        this.drinking = drinking;
        this.clothes = clothes;
    }
```
  1. 객체 생성 코드가 명시적이기 때문에 이해하기 쉽다.

    public static void main(String[] args) {
            Cart cart = new Cart.Builder()
                    .setClothes("바지")
                    .setDrinking("맥주")
                    .setSnack("칸쵸")
                    .build();
        }​
반응형
Comments