SMALL
https://velog.io/@sillutt/%EB%B9%8C%EB%8D%94-Builder-%ED%8C%A8%ED%84%B4
빌더 패턴
다양한 구성으로 만들어지는 인스턴스에 대해서 동일한 프로세스를 통해 만들 수 있게 도와주는 패턴. 객체를 만드는 프로세스를 독립적으로 분리할 수 있다.
Director를 추가하여 빌더를 사용하면 반복되는 호출 스택을 빌더 내에 숨기고 client는 Director를 통해서 객체를 받아 사용할 수 있다.
Builder class / interface
public interface TourPlanBilder {
TourPlanBuilder title (String title);
TourPlanBuilder nightAndDays (int nights, int days);
//...
//값의 세팅 상태, 인스턴스 상태를 검증할 수 있음
TourPlan getPlan();
}
public class DefaultTourBuilder implements TourPlanBuilder {
// private fields
@Override
public TourPlanBuilder nightsAndDays(int nights, int days) {
this.nights = nights;
this.days = days;
return this;
}
@Override
public TourPlan getPlan() {
return new TourPlan(title, nights, days, startDate, whereToStay, plans);
}
}
main class
public class App {
public static void main(String[] args) {
TourPlanBuilder builder = new DefaultTourBuilder();
builder.title("titile")
.nightAndDays(2, 3)
.startDate(localDate.of(2020, 12, 9))
.whereToStay("stay")
.addPlan(0, ",,,")
.getPlan();
TourPlan longBeachTrip
main에서 구현한 코드들을 builder 클래스로 이동하고 main App 클래스에서는 TourPlan tourPlan = director.메소드이름 형식으로 호출하여 wrapping할 수 있다.
장단점
장점
- 만들기 복잡한 객체를 순차적으로 만들 수 있게 도와준다.
- 동일한 프로세스를 거쳐 새로운 인스턴스를 만들 수 있다.
- 불완전한 객체를 사용하지 않도록 하는 안전장치의 역할을 한다.
단점
- director와 builder를 함께 사용해야 한다.
- 구조가 기존에 비해 복잡하다.
사용 예
- StringBuilder, StringBuffer
- StringBuilder는 Synchronized를 사용하지 않음
- Stream API
Think - Java Generic
Stream<String> names = Stream.<String>builder().add("name").add("type").build();
- Lombok
@Builder를 적용하여 컴파일 시 Annotation 프로세서를 수행한다. - Spring : URIComponents
URI를 안전하게 만들 수 있다.
SMALL
'강의 > Design pattern' 카테고리의 다른 글
어댑터 (Adapter) 패턴 (0) | 2022.08.16 |
---|---|
프로토타입 (Prototype) 패턴 (0) | 2022.08.16 |
추상 팩토리 (Abstract factory) 패턴 (0) | 2022.08.16 |
팩토리 메소드 (Factory method) 패턴 (0) | 2022.08.16 |
싱글톤(Singleton) 패턴 (0) | 2022.08.16 |