학습일지/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;
}
}
반응형