개발
home

[디자인 패턴] 빌더 패턴. Builder Pattern. Java

Created
2022/03/03
Tags
Design Pattern
Builder Pattern
Java
디자인 패턴
생성 패턴
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 디자인 패턴”