빌더 패턴이란
복잡한 객체를 생성하는 방법을 정의하는 클래스와 표현하는 방법을 정의하는 클래스를 별도로 분리하여, 서로 다른 표현이라도 이를 생성할 수 있는 동일한 절차를 제공하는 패턴이다. 빌더 패턴은 생성 패턴 중 하나이다. 빌더 패턴은 많은 Optional 한 멤버 변수나 지속성 없는 상태 값들에 대해 처리해야 하는 문제들을 해결한다. 팩토리 패턴이나 추상 팩토리 패턴에서는 생성해야 하는 클래스에 대한 속성 값이 많을 경우 아래와 같은 이슈가 있다.
1. 클라이언트 프로그램으로부터 팩토리 클래스로 많은 파라미터를 넘겨줄 때 타입, 순서 등에 대한 관리가 어려워져 에러가 발생할 확률이 높아진다.
2. 경우에 따라 필요 없는 파라미터들에 대해서 팩토리 클래스에 일일이 null 값을 넘겨줘야 한다.
3. 생성해야 하는 sub class가 무거워지고 복잡해짐에 따라 팩토리 클래스 또한 복잡해진다.
빌더 패턴은 이러한 문제들을 해결하기 위해 별도의 Builder 클래스를 만들어 필수 값에 대해서는 생성자를 통해 선택적인 값들에 대해서는 메소드를 통해 값을 입력받고 build() 메소드를 통해 최종적으로 하나의 인스턴스를 리턴하는 방식이다.
빌더 패턴 구현 방법
1. 빌더 클래스를 Static Nested Class로 생성한다. 관례적으로 클래스 이름 뒤에 Builder를 붙인다.
2. 빌더 클래스의 생성자는 public으로 하며, 필수 값들에 대해 생성자의 파라미터로 받는다.
3. 옵셔널한 값들에 대해서는 각각의 속성마다 메소드로 제공하며, 이때 중요한 것은 메소드의 리턴 값이 빌더 객체 자신이어야 한다.
4. 마지막으로 빌더 클래스 내에 build()메소드를 정의하여 최종 생성된 결과물을 제공한다. build()를 통해서만 객체 생성을 제공하기 때문에 생성 대상이 되는 클래스의 생성자는 private으로 정의해야 한다.
빌더 패턴의 장점
1. 가독성이 좋다.
2. 불필요한 생성자를 만들지 않고 깔끔하게 객체를 만들 수 있다.
3. 데이터 순서와 상관없이 객체를 만들 수 있다.
간단 예제
// Person
public class Person {
private String name;
private Integer age;
private String circles;
private String address;
public Person(String name, Integer age, String circles, String address) {
this.name = name;
this.age = age;
this.circles = circles;
this.address = address;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", circles='" + circles + '\'' +
", address='" + address + '\'' +
'}';
}
}
// PersonBuilder
public class PersonBuilder {
private String name;
private Integer age;
private String circles;
private String address;
public PersonBuilder setName(String name) {
this.name = name;
return this;
}
public PersonBuilder setAge(Integer age) {
this.age = age;
return this;
}
public PersonBuilder setCircles(String circles) {
this.circles = circles;
return this;
}
public PersonBuilder setAddress(String address) {
this.address = address;
return this;
}
public Person build() {
return new Person(name, age, circles, address);
}
}
// 사용법
PersonBuilder builder = new PersonBuilder();
Person person = builder.setCircles("프로그라피")
.setName("이준영")
.setAge(26);
.setAddress("면목동")
.build();
Log.d("test!!", person.toString());
'개발 서적' 카테고리의 다른 글
Clean Code 6장 객체와 자료 구조 (0) | 2022.05.21 |
---|---|
Clean Code 5장 형식 맞추기 (0) | 2022.05.18 |
Clean Code 4장 주석 (0) | 2022.05.10 |
Clean Code 3장 함수 (0) | 2022.05.07 |
Clean Code 2장 의미 있는 이름 (0) | 2022.05.06 |