[Java] 디자인 패턴 - Builder 패턴

lsj8367·2021년 3월 25일
0

Builder 패턴

빌더 패턴은 생성 인자가 많을 시, 빌더 객체를 통해 구체적인 객체를 생성한다.
빌더 패턴은 추상팩토리 패턴이나 팩토리 메소드 패턴과는 조금 다르다. 빌더 패턴도 새로운 객체를 만들어 반환하는 패턴이기는 하나, 동작방식이 조금 다르다.
빌더 패턴은 생성자에 들어갈 매개 변수의 수에 관계없이 차례대로 매개 변수를 받아들이고, 모든 매개 변수를 받은 뒤에 이 변수들을 통합하여 한번에 사용한다.

  • 장점
    • 객체 생성에 필요한 파라미터의 의미를 코드 단에서 명확히 알 수 있다.
      (가독성이 좋다)
    • 생성에 필요한 파라미터가 추가될 때 마다, 생성자 오버로딩을 안해도 된다.
  • 단점
    • 추가적인 빌더 클래스를 구현해야 한다.
  • 활용
    • 생성자 인자가 많은 경우.
User user = new User();
user.setId();
user.setName();
user.setAddress();

위의 코드보다 빌더 패턴을 적용한 아래의 코드가 훨씬 가독성이 좋고, 코드를 구현하기도 편하다.

User user = new UserBuilder()
                .setId()
                .setName()
                .setAddress()
                .build();

User.java

public class User {
    private int id;
    private String name;
    private String address;

    public User(int id, String name, String address){
        this.id = id;
        this.name = name;
        this.address = address;
    }

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public String getAddress() {
        return address;
    }
}

UserBuilder.java

public class UserBuilder {
    private int id;
    private String name;
    private String address;

    public UserBuilder setId(int id) {
        this.id = id;
        return this;
    }

    public UserBuilder setName(String name) {
        this.name = name;
        return this;
    }

    public UserBuilder setAddress(String address) {
        this.address = address;
        return this;
    }

    public User build() {
        return new User(id, name, address);
    }
}

Main.java

public class main {
    public static void main(String[] args) {
        UserBuilder builder = new UserBuilder();

        User user = builder
                .setId(1)
                .setName("홍길동")
                .setAddress("서울")
                .build();

        System.out.println(user.getId() + " " + user.getName() + " " + user.getAddress());
    }
}

빌더의 set메소드들을 반환하는 인자를 자기 자신을 하기 때문에 .으로 계속 연결하여 빌더를 구성할 수 있다.
이런식으로 구현을 진행하면 User객체를 가독성이 좋고 코딩하기도 편하게 할 수 있다.

마지막으로, Builder클래스를 객체를 만들어낼 클래스와 분리할 필요는 없다. 구현하는 클래스의 내부 클래스로 Builder 클래스를 포함시켜서 진행을 해도된다.
단, 이때에는 static 메소드를 활용하여 Builder를 반환해주도록 하자.

여기까지가 빌더패턴을 정리한 것이다. 이렇게 보니 객체를 생성할때 무척 편리하고 빌더로 인해 이 코드를 처음 보는 사람도 쉽게 이해할 수 있을 것 같다고 느낀다.

profile
기록을 많이 하자!💻

0개의 댓글