ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Design Pattern] Builder Pattern 빌더 패턴
    Study/Design Pattern 2021. 7. 22. 01:23

     

    public class Person{
    
        private final String name;
        private final int age;
        private final String country;
        private final String gender;
        
    }

    빌더 패턴은 객체를 생성하는 패턴으로 팩토리 패턴과는 또 다른 디자인 패턴입니다. 만약 위와 같은 Person이라는 클래스를 가정해보겠습니다. 만약 이 클래스를 생성자로 직접 생성한다면 다음과 같은 문제점이 발생할 수 있습니다.

     

     

    1. 클라이언트에서 생성자로 파라미터를 넘겨줄 때, 파라미터 수가 많으면 타입, 순서 관리가 어려워지고 가독성이 떨어집니다.

    만약 Person의 멤버 변수가 위와 같이 4개가 아닌 10개, 20개처럼 많으면 아래 코드처럼 생성자의 파라미터 부분이 길어 질 테고 가독성이 떨어집니다. 그리고 만약 추후에 새로운 멤버 변수가 추가되면 기존 코드를 모두 변경해 줘야 하는 번거로운 점이 발생합니다.

    Person person = new Person("오태식", 14, "한국", "남자", "빌더대학교", "180", "43",......);

     

    2. 필요 없는 멤버변수에 따라 생성자에 일일이 null 값을 건네줘야 합니다.

    만약 Person 클래스에서 country와 gender 정보가 필요 없으면 아래처럼 일일이 null 값을 입력해 줘야 합니다. 그럼 그냥 빈 클래스를 생성하고 setter함수를 통해 각 멤버변수값을 지정해 주면 되면 아닌가라고 생각하실 수 있는데 setter 메소드를 사용한다는 자체가 불필요한 수정과 확장을 열어두는 거기 때문에 Open-Closed 원칙에 위반되기 때문에 좋은 방법이 아닙니다.

    Person person = new Person("오태식", 42, null, null);

     

    3. 속성값이 많아질수록 팩토리 클래스가 생성해야 할 서브 클래스도 복잡해지고 무거워질 수 있습니다.

     

     

     

     

    public class Person{
    
        private final String name;
        private final int age;
        private final String country;
        private final String gender;
        
        
        public static class Builder{
        	private String name;
            private int age;
            private String country;
            private String gender;
            
            public Builder(){}
            
            public Builder name(String name){
            	this.name = name;
                return this;
            }
            
            public Builder age(int age){
            	this.age = age;
                return age;
            }
            
            public Builder country(String country){
            	this.country = country;
                return this;
            }
            
            public Builder gender(String gender){
            	this.gender = gender;
                return age;
            }
            
            public Person build(){
            	return new Person(this);
            }
        }
        
        private Person(Builder builder){
        	name = builder.name;
        	age = builder.age;
        	country = builder.country;
        	gender = builder.gender;
        }
        
    }
    // 클라이언트
    
    Person person = new Person.Builder
    	.name("오태식")
        .age(14)
        .country("한국")
        .gender("남자")
        .build();

     

     

    그래서 위와 같이 Builder 클래스를 구현하여 사용하면 setter 메소드를 구현하지 않아도 원하는 속성값만 넘겨줄 수 있고 객체를 원할 때 생성할 수 있다. 

     

    댓글

Designed by Tistory.