2022-03-03 @이영훈
빌더 패턴이란
빌더 패턴은 복잡한 객체를 생성하는 방법을 정의하는 클래스와 표현하는 방법을 정의하는 클래스를 별도로 분리하여, 서로 다른 표현이라도 이를 생성할 수 있는 동일한 절차를 제공하는 패턴입니다.
빌더 패턴의 장점
1.
클래스 변수가 추가되어도 기존 코드를 변경할 필요가 없습니다
2.
불변성을 확보할 수 있습니다
a.
수정자(setter) 방식으로는 인스턴스가 생성된 이후에 어느 곳에서나 setter로 변경이 가능하기 때문에 변수가 변경될 수 있기 때문에 신중하게 코드를 작성해야 합니다
빌더 패턴으로 클래스 구현
Person 클래스를 빌더 패턴으로 구현한 클래스입니다
PersonBuilder라는 빌더 구체화 클래스를 추가로 생성하였습니다. 그리고 변수들을 지정할 수 있는 구체 함수들을 지정하는 내부 함수들을 구현하고 build() 함수로 인스턴스를 생성합니다.
// Person.java
public class Person {
private String name;
private int age;
private String favoriteColor;
public Person(String name, int age, String favoriteColor) {
this.name = name;
this.age = age;
this.favoriteColor = favoriteColor;
}
// builder 함수 (static 함수임을 유의)
public static PersonBuilder builder() {
return new PersonBuilder();
}
// 빌더 내부 함수 (내부 변수들 설정 함수, build 함수)
public static class PersonBuilder {
private String name;
private int age;
private String favoriteColor;
public PersonBuilder name(String name) {
this.name = name;
return this;
}
public PersonBuilder age(int age) {
this.age = age;
return this;
}
public PersonBuilder favoriteColor(String favoriteColor) {
this.favoriteColor = favoriteColor;
return this;
}
public Person build() {
return new Person(name, age, favoriteColor);
}
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", favoriteColor='" + favoriteColor + '\'' +
'}';
}
}
Java
복사
자바 Lombok을 사용해서 빌더 패턴 구현
lombok 라이브러리를 사용하면 편하게 빌더 패턴을 구현할 수 있습니다.
롬북을 사용하면 컴파일 시 @Builder 어노테이션을 확인하여, 필요한 메소드를 자동으로 생성해 코드를 바이트 코드로 만들어줍니다.
// PersonLombok.java
import lombok.Builder;
import lombok.ToString;
@Builder
@ToString // 필요하다면 추가해주세요
@Getter // 필요하다면 추가해주세요
public class PersonLombok {
private String name;
private int age;
private String favoriteColor;
}
Java
복사
호출
// BuildPatternApplication.java
public class BuildPatternApplication {
public static void main(String[] args) {
Person leedo = Person.builder()
.name("이도")
.age(29)
.favoriteColor("Sea Blue")
.build();
// leedo = Person{name='이도', age=29, favoriteColor='Sea Blue'}
System.out.println("leedo = " + leedo);
}
}
Java
복사
필수 파라미터가 포함된 빌더 패턴 구현
lombok에서 builder 함수명을 다른 것(requiredArgBuilder)으로 수정합니다. 그리고 static으로 빌더 함수(builder)를 새롭게 정의해서 사용합니다.
@Builder(builderMethodName = "requiredArgBuilder")
@ToString
@Getter
public class PersonLombok {
private final String name;
private int age;
private String favoriteColor;
public static PersonLombokBuilder builder(String name) {
return requiredArgBuilder().name(name);
}
}
Java
복사
필수 파라미터가 포함된 빌더 호출
// BuildPatternApplication.java
public class BuildPatternApplication {
public static void main(String[] args) {
PersonLombok personLombok = PersonLombok.builder("이도")
.age(29)
.build();
// personLombok = PersonLombok(name=이도, age=29, favoriteColor=null)
System.out.println("personLombok = " + personLombok);
}
}
Java
복사
Ref.
도서 "GoF 디자인 패턴”