[생성 패턴] Builder pattern (빌더 패턴)


제품을 여러 단계로 나눠서 만들 수 있도록 제품 생산 단계들을 캡슐화할 때

1. 불필요한 생성자를 만들지 않고 객체를 만든다.

2. 데이터의 순서에 상관 없이 객체를 만들어 낸다.

3. 사용자가 봤을때 명시적이고 이해할 수 있어야 한다.

 

빌더 패턴은 간단한 객체와 단계별 접근을 사용하여 복잡한 객체를 만든다.
Builder 클래스는 단계적으로 최종 객체를 만든다. 이 builder는 다른 객체에 독립적이다.


public class PersonInfoBuilder {

    private String name;

    private Integer age;

    private String favoriteColor;

    private String favoriteAnimal;

    private Integer favoriteNumber;


    public PersonInfoBuilder setName(String name) {

        this.name = name;

        return this;

    }


    public PersonInfoBuilder setAge(Integer age) {

        this.age = age;

        return this;

    }


    public PersonInfoBuilder setFavoriteColor(String favoriteColor) {

        this.favoriteColor = favoriteColor;

        return this;

    }


    public PersonInfoBuilder setFavoriteAnimal(String favoriteAnimal) {

        this.favoriteAnimal = favoriteAnimal;

        return this;

    }


    public PersonInfoBuilder setFavoriteNumber(Integer favoriteNumber) {

        this.favoriteNumber = favoriteNumber;

        return this;

    }


    public PersonInfo build(){

        PersonInfo personInfo = new PersonInfo(name, age, favoriteColor, favoriteAnimal, favoriteNumber);

        return personInfo;

    }

}



public class BuilderPattern {

    public static void main(String[] args) {

        // 빌더 객체를 하나 만듭니다.

        PersonInfoBuilder personInfoBuilder = new PersonInfoBuilder();

        // 빌더 객체에 원하는 데이터를 입력합니다. 순서는 상관 없습니다.

        PersonInfo result = personInfoBuilder

                .setName("MISTAKE")

                .setAge(20)

                .setFavoriteAnimal("cat")

                .setFavoriteColor("black")

                .setName("JDM") // 다시 같은 메소드를 호출한다면 나중에 호출한 값이 들어갑니다.

                .setFavoriteNumber(7)

                // 마지막에 .build() 메소드를 호출해서 최종적인 결과물을 만들어 반환합니다.

                .build();

        // print is "name:JDM, age:20, favoriteColor:black, favoriteAnimal:cat, favoriteNumber:7"

        System.out.println(result.getPersonInfo());

    }

}

Posted by kunoo
,