Builder Pattern
복잡한 객체의 생성 과정과 표현 방법을 분리하여 동일한 생성 절차에서 서로 다른 표현 결과를 만들 수 있게 하는 패턴.
빌더 패턴은 팩토리 패턴 또는 추상 팩토리 패턴과 매우 비슷하다.
빌더 패턴을 사용하는 이유
- 불필요한 생성자를 만들지 않고, 객체를 생성
- 데이터의 순서에 상관없이 객체를 생성
- 명시적이고, 이해하기 쉬움
- 유지보수가 편함
즉 빌더 패턴은 객체 생성을 깔끔하고, 유연하게 하기 위한 기법
빌더 패턴을 이해하려면 이전의 객체 생성 패턴을 알아볼 필요가 있다.
객체 생성 패턴의 종류
[점층적 생성자 패턴] -> [자바빈 패턴] -> [빌더 패턴]
점층적 생성자 패턴(Telescoping Constructor Pattern)
: 생성자 오버로딩을 통한 모든 인자를 받는 여러 개의 생성자를 만든다.
public class Member{
private String id; // 필수
private String name; // 필수
private String gender; // 선택
public Member(){}
public Member(String id){
this.id = id;
}
public Member(String id, name){
this.id = id;
this.name = name;
}
public Member(String id, name, String gender){
this.id = id;
this.name = name;
this.gender = gender;
}
}
단점
- 다른 생성자를 호출하는 생성자가 많아질 경우, 인자가 추가될 때 코드 수정이 어렵다.
- 설정할 필요가 없는 필드(필수가 아닌 필드)에도 인자를 전달해야 하는 경우가 생긴다.
- 인자수가 늘어나면 코드 가독성이 떨어진다 (인자 수가 많은 생성자의 경우, 코드만 보고 의미를 해석하기 어렵다.)
자바빈 패턴 (JavaBeans Pattern)
: setter 메소드를 이용하여 객체에 값을 세팅한다.
위의 점층적 생성자 패턴의 단점이었던 인자수가 늘어나면 코드 작성이 어려워지고 읽기 어려운 코드가 되는 단점을 보완한 방법이 자바빈 패턴이다.
public class Member{
private String id;
private String name;
private String gender;
public Member(){}
public void setId(String id){
this.id = id;
}
}
이렇게 setter 메소드를 통해서 객체를 생성할 수 있다.
단점
- 객체 일관성이 깨진다 : 1회의 호출로 객체 생성이 끝나지 않는다. (한번 생성한 객체에 값을 계속 세팅함)
- 1회의 함수 호출로 객체 생성을 끝낼 수 없으므로, 변경 불가능(immutable) 클래스를 만들 수가 없다 : 스레드 안전성을 확보하려면 점층적 패턴보다 많은 일을 해야 한다.
위의 두 패턴의 대안으로서 나온 패턴이 빌더 패턴이다. 빌더 패턴은 점층적 생성자 패턴의 안정성과 자바빈 패턴의 가독성을 결함한 패턴이다.
빌더 패턴 = 점층적 생성자 패턴의 안정성 + 자바빈 패턴의 가독성을 결합한 패턴
public class Member{
private final String id;
private final String name;
private String gender;
public Member(Builder builder){
this.id = builder.id;
this.name = builder.name;
this.gender = builder.gender;
}
public static class Builder{
private final String id; // 필수
private final String name; // 필수
private String gender;
public Builder(String id, String name){
this.id = id;
this.name = name;
}
// 선택적 인잔는 Builder 타입의 함수를 통해 설정
public Builder gender(String gender){
this.gender = gender;
return this;
}
public Member build(){
return new Member(this);
}
}
}
Member 클래스의 필드가 final로 선언되었으므로 변경 불가능(immutable) 객체 생성이 가능해진다.
모든 인자의 기본값(default value)을 한 곳에서 처리가능
Builder 객체 내에서 피루 인자는 final로 선언함으로써 필수적으로 생성자를 통해 생성.
Builder 객체 내에서 선택 인자를 기본 값으로 초기화를 하고 Builder 형으로 자기 자신을 return.
Builder 객체 내의 build 함수로 빌더 객체 자신을 Member 형으로 반환.
* 빌더 패턴은 인자가 많은 생성자나 정적 팩토리가 필요한 클래스를 설계할 때, 특히 대부분의 인자가 선택적 인자인 상황에 유용하다.
[참고]
https://ifcontinue.tistory.com/8?category=695933
'IT 관련기술' 카테고리의 다른 글
[Linux] 리눅스 우분투(Ubuntu) Oracle Java JDK 설치 (0) | 2022.01.19 |
---|---|
[윈도우 프로그래밍] Hooking & Filter Driver (0) | 2022.01.19 |
[JPA] JPA (Java Persistence API) (0) | 2022.01.06 |
[Linux] 리눅스 디렉토리 구조 (0) | 2021.01.22 |
스마트폰을 웹캠으로, 드로이드 캠(DroidCam) 설치 및 사용법 (5) | 2021.01.20 |
댓글