티스토리 뷰
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 |
---|