ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Design Pattern] 빌더 패턴
    디자인패턴 2021. 12. 19. 17:31

    1. 빌더패턴 란?

    • 빌더 패턴은 객체 생성과정을 그 개체의 클래스로부터 분리시키는 하나의 방법이다.
    • 객체의 부분부분을 만들어 나가다가 준비되면 객체를 생성해나가는 방식이다.

     

    2. 빌더 패턴의 장점(= 생성자의 문제 해결)

    • 생성자가 여러개의 인자를 받을 때 그 순서의 오류는 막지 못한다.(type이 같다면 막을 수 가 없음)
    • 필요 없는 인자에 대해서 null 값을 넘겨 주거나 여러개의 생성자를 만들어야한다.
    • 유지보수에 유리하다
      • 기존의 코드에 생성자 인자 값을 추가해야할때 기존의 코드를 고치지 않고 builder 에 메서드를 추가하여 제작할 수 있다.(Open - Close 원칙 준수)

     

     

    2-1. 빌더 패턴의 단점 

    빌더패턴으로 인핸 생성에 있어 자유도가 생겼습니다.

    실질적으로는 반드시 넣어서 제작해야하는 파라미터임에도 이 부분을 잊고 넣지 않더라도 생성이 가능합니다.

    즉 무결성을 해칠 수 있게 되는 것입니다.

    예를 들어 아래 예제에서처럼 빌더를 제작하고 emplyee 를 생성한다면 employee의 맴버 변수 startingYear는 0을 갖게되어 의도치 않은 실수를 발생시킬 수 있습니다.

     

     

    3. 예제

    • 생성자는 빌더만을 인자로 받는다.
    • 빌더의 함수들은 빌더 자신을 반환하여 플루언트 인터페이스로 제작한다.
    //main
    
     Employee employee = new EmployeeBuilder(11)
                    .setAge(10)
                    .setLastName("kim")
                    .setFirstName("john")
                    .build();
    
    System.out.println(employee.getFirstName()); // john

     

    //Emplyee
    public class Employee {
        int id;
        int age;
        int startingYear;
        String firstName;
        String lastName;
    
        public Employee(EmployeeBuilder employeeBuilder) {
            this.id = employeeBuilder.id;
            this.age = employeeBuilder.age;
            this.startingYear = employeeBuilder.startingYear;
            this.firstName = employeeBuilder.firstName;
            this.lastName = employeeBuilder.lastName;
        }
    
    }
    //EmplyeeBuilder
    
    public class EmployeeBuilder {
    
        int id;
        int age;
        int startingYear;
        String firstName;
        String lastName;
    
    
        public EmployeeBuilder(int id) {
            this.id = id;
        }
    
        public Employee build() {
            return new Employee(this);
        }
    
        public EmployeeBuilder setAge(int age) {
            this.age = age;
            return this;
        }
    
        public EmployeeBuilder setStartingYear(int startingYear) {
            this.startingYear = startingYear;
            return this;
        }
    
        public EmployeeBuilder setFirstName(String firstName) {
            this.firstName = firstName;
            return this;
        }
    
        public EmployeeBuilder setLastName(String lastName) {
            this.lastName = lastName;
            return this;
        }
    }

    댓글

Designed by Tistory.