본문 바로가기
자바

자바 - 빌더 패턴

by 개발자 포비 2024. 11. 25.

 public 생성자나 정적 메소드 패턴을 사용하여 객체를 생성한다 하더라도, 매개변수가 많아지면서 정적 메서드 패턴을 사용하는 것은 가독성이 떨어지고 복잡해진다. 자바 빈즈 패턴을 이용하여 가독성을 올릴 수 있으나, 객체가 일시적으로 불완전한 상태를 지니게 된다. 빌더 패턴을 사용하면 이러한 문제들을 해결하고 각각의 장점을 살릴 수 있다. 또한, 계층적으로 설계된 클래스에서도 상속한 클래스와 해당 빌더를 상속하여 추가적으로 구현하면서 사용하기에 용이하다.

 적은 매개변수를 가지는 경우, 빌더를 만들어야 하는 수고로움이 오히려 비용을 증가시킬 수 있으나, API 등을 만들어 운영하다보면 매개변수가 계속해서 증가할 확률이 높다. 장기적으로 보았을 때 빌더 패턴을 사용하는 것이 좋은 점이 더 많다.

import java.util.ArrayList;
import java.util.List;

public class Human {
    private final long id;
    private final String name;

    private List<String> friends;
    private int age;
    private int height;

    public static class Builder{
        private final long id;
        private final String name;

        private List<String> friends = new ArrayList<>();
        private int age = 0;
        private int height = 0;

        public Builder(long id, String name) {
            this.id = id;
            this.name = name;
        }

        public Builder addFriend(String friend){
            friends.add(friend);
            return this;
        }

        public Builder setAge(int age){
            this.age = age;
            return this;
        }

        public Builder setHeight(int height){
            this.height = height;
            return this;
        }

        public Human build(){
            return new Human(this);
        }
    }

    public Human(Builder builder) {
        this.id = builder.id;
        this.name = builder.name;
        this.age = builder.age;
        this.height = builder.height;
        this.friends = builder.friends;
    }

    @Override
    public String toString() {
        return "Human{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", friends=" + friends +
                ", age=" + age +
                ", height=" + height +
                '}';
    }

 	// 빌더 패턴을 이용하여 생성하는 모습이다.
    public static void main(String[] args) {
        Human human = new Builder(1, "이름")
                .setAge(20)
                .setHeight(180)
                .addFriend("철수")
                .addFriend("짱구")
                .build();
        System.out.println(human);
    }
}

'자바' 카테고리의 다른 글

자바 - 의존성 주입  (0) 2024.11.26
자바 - 싱글턴 패턴  (0) 2024.11.25
자바 - 정적 메소드 생성  (0) 2024.11.25
자바 - 정규화 표현 문법  (0) 2024.11.24
자바 JVM - 힙 영역과 GC  (0) 2024.11.23

댓글