빌더 패턴(Builder Pattern)

빌더 패턴

  • 객체의 생성을 가독성 있게 만들고, 여러 개의 매개변수를 갖는 생성자를 피하며, 선택적인 매개변수를 다루기 위해 사용되는 디자인 패턴

사용하는 이유

  • 일반적으로 매개변수를 가진 생성자를 이용하기 위해서 매개변수의 순서를 기억하고 전달해야하는 불편함이 존재했음,
  • 일부 매개변수가 선택적이여서 오버로드된 생성자를 많이 사용해야하는 문제가 있었음
  • 매개변수 순서 기억할 필요없음, 선택적인 필드들을 다루기 쉬움, 가독성과 유지보수성 향상, 불변성 유지 가능

단점?

  • 빌더 클래스를 따로 작성해야한다는 단점이 존재함

빌더 패턴 사용법

  1. 빌더 클래스 정의
    • 생성하고자 하는 객체의 필드들을 멤버 변수로 가지는 빌더 클래스를 정의
  2. 빌더 메서드 정의
    • 빌더 클래스는 필드들을 설정하는 메서들들을 구현
    • 메서드들은 빌더 객체 자체를 반환하도록하여 메서드 체인으로 호출할 수 있게 만든다
  3. 빌더 객체의 빌드 메서드
    • 빌더 클래스에서 설정한 필드들을 사용하여 실제 객체를 생성하는 빌드 메서드 구현

순수 자바로 구현한 빌더 패턴

 public class Person {
    private String name;
    private int age;
    private String address;

    private Person() {
        // private 생성자로 외부에서 직접 객체 생성을 막음
    }

    // 빌더 클래스 정의
    public static class Builder {
        private String name;
        private int age;
        private String address;

        public Builder() {
            // 빌더 클래스의 기본 생성자
        }

        public Builder name(String name) {
            this.name = name;
            return this;
        }

        public Builder age(int age) {
            this.age = age;
            return this;
        }

        public Builder address(String address) {
            this.address = address;
            return this;
        }

        public Person build() {
            Person person = new Person();
            person.name = this.name;
            person.age = this.age;
            person.address = this.address;
            return person;
        }
    }

    // getter 메서드들 생략 (필요한 경우 추가 가능)
}

// 사용 예시
public class Main {
    public static void main(String[] args) {
        // 빌더 패턴을 사용하여 객체 생성
        Person person = new Person.Builder()
                .name("John")
                .age(30)
                .address("New York")
                .build();

        System.out.println(person.getName());    // John
        System.out.println(person.getAge());     // 30
        System.out.println(person.getAddress()); // New York
    }
}

롬복(Lombok) 라이브러리로 생성한 빌더 패턴

import lombok.Builder;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
@Builder
public class Person {
    private String name;
    private int age;
    private String address;
}

// 사용 예시
public class Main {
    public static void main(String[] args) {
        Person person = Person.builder()
            .name("John")
            .age(30)
            .address("New York")
            .build();

        System.out.println(person.getName());    // John
        System.out.println(person.getAge());     // 30
        System.out.println(person.getAddress()); // New York
    }
}

'CS' 카테고리의 다른 글

Java Optional이란?  (0) 2023.07.23
JAVA - StringBuilder와 System.out.print의 속도차이  (0) 2023.07.14
LinkedList와 ArrayList의 속도차이 및 용도  (0) 2023.07.13
FrameWork VS Library 차이점  (0) 2023.07.13