티스토리 뷰

반응형

Builder 패턴은 같은 타입의 인스턴스 변수가 많고 생성자를 많이 선언해야 할 때 사용하면 좋고 인스턴스 변수 중 객체 생성 시 반드시 초기화해야 할 변수가 적을 때가 좋다.

아래 설명을 보자.

 

public class User {
    private String name;
    private String password;
    private int age;
    private int stature;
    private String number;
    private String nickname;
     
    public User(String name, String password, int age, int stature, String number, String nickname){
        this.name = name;
        this.password = password;
        this.age = age;
        this.stature = stature;
        this.number = number;
        this.nickname = nickname;
    }
}

위와 같은 코드가 있을 때 

User user = new User("name", "password", 18, 178, "010-0000-0000", "nickname");

 

사용자는 위 코드처럼 객체를 생성할 것이다.

User user = new User("name", null, 0, 178, null, "nickname");

 

그런데 위에 있는 코드처럼 필요하지 않은 내용까지 인자를 전달해야 하는 경우가 생길 수 있는데 이때 필요한 내용만 담아서 객체를 생성할 일이 많아져서 필요한 내용만 담는 생성자를 만들어서 사용할 수 있을 것이다. 하지만 필요에 따라 생성자를 만들다 보면 많은 생성자가 생길 것이고 많이 생기는 만큼 읽기도 어려워지고 실수할 가능성도 커진다. 그리고 인스턴스 변수는 많지만, 변수의 타입이 int와 String 두 가지인데 데이터를 잘못 입력할 여지가 많아 실수할 가능성도 커진다.

 

이럴 때 사용하면 좋은 패턴이 Builder 패턴인데 어떻게 만드는지 알아보자.

public class User {
    private String name;
    private String password;
    private int age;
    private int stature;
    private String number;
    private String nickname;
     
    private User(String name, String password, int age, int stature, String number, String nickname){
        this.name = name;
        this.password = password;
        this.age = age;
        this.stature = stature;
        this.number = number;
        this.nickname = nickname;
    }
     
    public static class UserBuilder {
        private String name;
        private String password;
        private int age = 0;
        private int stature = 0;
        private String number = "";
        private String nickname = "";
         
        public UserBuilder(String name, String password){
            this.name = name;
            this.password = password;
        }
         
        public UserBuilder setAge(int age) {
            this.age = age;
            return this;
        }
        public UserBuilder setStature(int stature) {
            this.stature = stature;
            return this;
        }
        public UserBuilder setNumber(String number) {
            this.number = number;
            return this;
        }
        public UserBuilder setNickname(String nickname) {
            this.nickname = nickname;
            return this;
        }
        public User build(){
            return new User(name, password, age, stature, number, nickname);
        }
    }
}

 

위 코드에서 구현한 Builder 패턴은 public static 한 내부클래스로 구현한 것이고 내부클래스가 아니라 public 한 클래스로 만들어도 상관없다.

 

클래스를 생성하는 방법은 아래와 같다.

User user = new User.UserBuilder("name", "password")
                    .setAge(18)
                    .setStature(178)
                    .setNumber("010-1234-1234")
                    .setNickname("nickname")
                    .build();

 

Builder 패턴을 만들고 객체를 생성해 봤는데

Builder 패턴의 장단점을 알아보자.

* 객체 생성 시 반드시 초기화해야 하는 변수 = 필수값, 객체 생성 시 반드시 초기화할 필요가 없는 변수 = 선택값;

 - 장점 -

1. 필수값을 Builder Class의 생성자로 표현할 수 있다.

2. 선택값의 setter를 호출하지 않아도 초기화할 수 있다.

3. 선택값의 경우 사용자가 원하는 변수에 정확한 값을 넣을 수 있다.

4. 불변객체를 만들 수 있다.

5. 여러개의 가변인자를 가질 수 있다.

 

 - 단점 - 

1. 필수값의 경우 같은 타입의 변수가 있으면 실수의 여지가 남아있다.

2. 객체를 만들 때 Builder 객체도 같이 만들어야 하므로 성능이 낮아질 수 있다.

반응형

'프로그래밍 > 디자인 패턴' 카테고리의 다른 글

[JAVA] 싱글톤 패턴  (0) 2016.12.23
댓글
반응형
최근에 올라온 글
Total
Today
Yesterday
글 보관함
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31