ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Builder Pattern
    JAVA 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을 도입해보자.

    public class User {
        private String id;
        private Stirng name;
        private String email;
    }

    builder 사용 모습

    User.builder()
            .id("djd")
            .build();
    
    
    User.builder()
            .id("ojs")
            .name("junseok")
            .email("ixtears@naver.com")
            .build();

    필수로 갖춰야 하는 요건

    1. builder() 메서드는 User 클래스의 public static으로 만들어져야 하고 UserBuilder 객체를 인스턴스화 해서 리턴해야 한다.
    2. id("")/name("")/email("") 은 User.builder()로 만들 클래스의 public 메서드로 만들어져야 한다.
    3. id("")/name("")/email("") 은 모두 User.builder()로 만들어진 객체를 return 해야 한다.
    4. 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);
            }
        }
    }

     

     

    댓글

Designed by Tistory.