학습일지/Language

[Design Pattern] Builder

inspirit941 2020. 12. 16. 08:44
반응형

Builder 패턴

객체 생성 시 흔히 사용되는 패턴. Dot chain 문법이라고도 부른다.

빌더 패턴을 다루는 두 가지 설명

  • GoF Design Pattern: 객체의 생성 / 조립 방법을 분리할 목적
  • Effective Java의 builder Pattern
    • GoF의 패턴보다는 좀 더 코딩위주의 활용법. 코드 가독성 / 유지보수성을 위해 빌더 패턴을 권장함
    • 객체 일관성, 불변성 (변경불가능) 등의 특징을 강조

규칙, 생성자 인자가 많을 경우 builder 패턴을 권장하는 편.

  • effecitve java의 builder pattern은 깔끔하고 유연하게 객체를 생성하기 위한 기법.
@Getter @Setter @AllArgsConstructor
// 생성자에서 특정 필드만 제거한 채 구현하려면, 그만큼의 생성자를 매번 만들어줘야 한다.
// Builder Pattern으로 이 문제를 해결 가능함.
public class Person {
    private String firstName;
    private String lastName;
    private LocalDate birthDate;
    private String addressOne;
    private String addressTwo;
    private String sex;
    private boolean driverLicence;
    private boolean married;
}


public class TestBuilderPattern {
    public static void main(String[] args){

    }
    public static Person createPersonForTesting() {
        // 매번 모든 필드를 setter로 입력할 경우 값 세팅이 어려워진다.
        Person p1 = new Person();
        //.....
        return person;
    }
}

builder Pattern을 구현하려면 아래처럼 Person 객체를 정의해야 한다.

public class PersonBuilder {
    private String firstName;
    private String lastName;
    private LocalDate birthDate;
    private String addressOne;
    private String addressTwo;
    private String sex;
    private boolean driverLicence;
    private boolean married;
    // builder 패턴 구조
    public PersonBuilder firstName(String firstName) {
        this.firstName = firstName;
        return this;
    }
    // ... 형태로 모든 필드의 setter 변경.
    // 1. setter 메소드 이름을 필드명과 일치시킴
    // 2. 리턴타입을 객체로 변경. return this;가 되도록.
    // build() 메소드 생성
    public PersonBuilder build() {
        Person person = new Person();
        // person 객체에 setter로 필드값 입력
        // builder 객체에서 정의하지 않은 필드는 null로 초기화된다.
        return person;
    }
}


@Getter @Setter
public class Person {
    private String firstName;
    private String lastName;
    private LocalDate birthDate;
    private String addressOne;
    private String addressTwo;
    private String sex;
    private boolean driverLicence;
    private boolean married;

    public static PersonBuilder builder() {
        return new PersonBuilder();
    }
}

public class TestBuilderPattern {
    public static void main(String[] args) {
        Person p1 = Person.builder()
                .firstName("test")
                .build();
        System.out.println(p1.getFirstName()); // return test;
    }
}
반응형