public class User {
private String id;
private Stirng name;
private String email;
}
-
Builder PatternJAVA 2021. 6. 3. 14:42
간략히 설명해서 Builder Pattern을 쓰는 이유는
아래와 같은 코드가 있다고 가정하고 이야기 해보자.
new User("junseok", null, null); new User("", "junseok", "email"); new User(null, null, "email");
지금은 매개변수가 3개 뿐이지만 만약 10개가 넘는 생성자 호출이 있다고 하면 코드만 봐서는 어떤 필드에 값이 들어가는건지 알 수 없고 상당히 추한 모습의 코드가 만들어질 것이다.
위의 방법으로 추한 코드 모습을 만들고 싶지 않은 경우에는 모든 경우의 수를 충족하도록 매개변수를 받는 생성자를 추가해야 한다. 상당한 낭비.
new User("junseok"); new User("junseok", "email"); new User("email"); // ... public User(String id) { //... } public User(String id, email) { //... } public User(String email) { //... } // ...
아래 User 클래스에 Builder Patter을 도입해보자.
builder 사용 모습
User.builder() .id("djd") .build(); User.builder() .id("ojs") .name("junseok") .email("ixtears@naver.com") .build();
필수로 갖춰야 하는 요건
- builder() 메서드는 User 클래스의 public static으로 만들어져야 하고 UserBuilder 객체를 인스턴스화 해서 리턴해야 한다.
- id("")/name("")/email("") 은 User.builder()로 만들 클래스의 public 메서드로 만들어져야 한다.
- id("")/name("")/email("") 은 모두 User.builder()로 만들어진 객체를 return 해야 한다.
- build() 메서드는 User.builder()로 만들어진 객체안에 public 메서드로 만들어져야 한다.
builder()로 만들어지는 UserBuilder 클래스의 이름은 UserBuilder가 아니여도 상관 없다. User 객체를 생성해 주기 위한 껍대기에 불과하다. 부분별 코드 설명
- builder() 메서드는 User 클래스의 public static으로 만들어져야 하고 UserBuilder 객체를 인스턴스화 해서 리턴해야 한다.
public class User { // ... public static UserBuilder builder() { return new UserBuilder(); } public static UserBuilder UserBuilder() { // ... } // ... }
- id("")/name("")/email("") 은 User.builder()로 만들 클래스의 public 메서드로 만들어져야 한다.
- id("")/name("")/email("") 은 모두 User.builder()로 만들어진 객체를 return 해야 한다.
public static class UserBuilder { /// ...field public UserBuilder id(String id) { this.id = id; return this; } public UserBuilder name(String name) { this.name = name; return this; } public UserBuilder email(String email) { this.email = email; return this; } /// ... }
- build() 메서드는 User.builder()로 만들어진 객체안에 public 메서드로 만들어져야 한다.
public static class UserBuilder { // ... public User build() { return new User(this.id, this.name, this.email); } }
최종 소스
public class User { private String id; private String name; private String email; public static UserBuilder builder() { return new UserBuilder(); } public User(String id, String name, String email) { this.id = id; this.name = name; this.email = email; } public static class UserBuilder { private String id; private String name; private String email; public UserBuilder id(String id) { this.id = id; return this; } public UserBuilder name(String name) { this.name = name; return this; } public UserBuilder email(String email) { this.email = email; return this; } public User build() { return new User(this.id, this.name, this.email); } } }
'JAVA' 카테고리의 다른 글
TDD 요약 정리 - 테스트 주도 개발/테스팅 패턴, 빨간/초록 막대 (0) 2022.07.04 TDD - 2부 xUnit 간단 정리 (0) 2022.06.27 TDD 17장. Money 회고 요약 및 정리 (0) 2022.06.27 primitive type vs wrapper class (0) 2021.10.31 메서드 추출(Extract Method) (0) 2021.05.18