Builder Pattern

이한수·2022년 6월 28일
0
post-thumbnail

Builder Pattern

복잡한 객체를 생성하는 클래스와 표현하는 클래스를 분리하여,

동일한 절차에서도 서로 다른 표션을 생성하는 방법을 제공하는

패턴.

@Getter
public class Person{

		private String name;		//이름
        private Integer age;		//나이
        private String tel;			//전화번호
        private String email;		//이메일
        
        public Person(){}
        
}

Person이라는 클래스가 있다.

해당 클래스가 가진 멤버 변수를 초기화하면서 생성한다고 가정해보자.

	public Person(String name , Integer age , String tel , String email){
			this.name = name;
			this.age = age;
			this.tel = tel;
			this.email = email;
	}
    
    //이러한 생성자가 필요할 것이다.
    
    String name = "홍길동";
    String age = 10;
    String tel = "000-0000-0000";
    String email = "dflksdjf@dsaflkj.net"
    
    Person person = new Person(name , age , tel , email);
    
//생성 코드

여기까지 방식의 문제

  • 특정 필드만 초기화하여 사용하고자 할 때마다 생성자가 필요하다.

  • 데이터의 순서를 맟춰서 주입해줘야 한다.

  • 가독성 측면에서 좋지 못하다.


JavaBean 패턴

Setter메소드를 이용하면 특정 필드만 초기화하여 사용할 수 있다.

뿐만 아니라 , 어느 필드에 값이 들어갔는지 명확하게 알 수 있다.

Person person = new Person();

person.setName("홍길동");
person.setAge(10);

여기까지 방식의 문제

  • 한번 값이 주입되고 나서 , 변경될 일이 없는 데이터도
    변경될 수 있다.

  • 초기화할 필드만큼 setter를 호출 해야 한다.


Builder 적용

Person을 Builder패턴을 적용하여 구현 해보자.

public class Person{
		
        private String name;
        private Integer age;
        private String tel;	
        private String email;
        
        
    //생성자.
	public Person(String name , Integer age , String tel , String email){
				
            this.name = name;
			this.age = age;
			this.tel = tel;
			this.email = email;
	}
        
     //PersonBuilder 반환.
     public static Person.PersonBuilder builder() {
        return new Person.PersonBuilder();
    }   
     
     
     //내부 클래스 Builder 클래스 사용
     public static class PersonBuilder{
     		
        private String name;
        private Integer age;
        private String tel;	
        private String email;
        
        PersonBuilder(){}
        
       
        public Person.PersonBuilder name(final String name){
        	this.name = name;
            return this;
        }
        
        public Person.PersonBuilder age(final int age){		
        	this.age =age;
        }
        
       public Person.PersonBuilder tel(final String tel){		
        	this.tel =tel;
        }
        
        public Person.PersonBuilder email(final String email){		
        	this.email =email;
        }
            
        public Person build(){
        	return new Person(this.name , this.age , this.tel , this.email);
        }
     }
}
  Person person = Person.builder()
  					    .name("홍길동")
                        .age(10)
                        .build();

장점

  • 어떤 값이 주입되었는지 한눈에 파악이 가능하며,

    한번의 호출로 객체를 생성해서 이전 JavaBean 패턴의 단점을 보완한다.

  • 생성자처럼 파라미터의 순서를 지킬 필요가 없다.

    마지막에 build라는 메서드가 생성자의 순서에 알아서 주입
    주는 덕이다.

  • 생성자를 매번 생성해줄 필요가 없다.

  • 불변성을 확보할 수 있다.

참고 :
https://dev-youngjun.tistory.com/197

profile
성실하게

0개의 댓글