안녕하세요 개발자 홍성호 입니다.
요즘 Java 언어로 배우는 디자인 패턴 입문 책으로 사내 스터디에 참여하고 있는데요.
이번주는 빌더 패턴 차례라서 공부를 하게 되었습니다.
예전부터 빌더 패턴은 자주 접하게 되었던것 같아요.
객체 생성시에 지정해줘야하는 요소들이 다양할 때 빌더 패턴을 이용하고 있습니다.
빌더 패턴의 원래 의도가 맞는건지 점검해보고 싶었어요.
이팩티브 자바의 빌더 패턴
조금 찾아보니 이팩티브 자바의 빌더 패턴과, GoF의 빌더 패턴이 차이가 있었습니다.
아래의 글을 보면 자세히 알 수 있는데요.
이팩티브 자바의 빌더패턴은 생성자에 매개변수가 많을 때 사용합니다.
https://johngrib.github.io/wiki/builder-pattern/
이 패턴도 실무에서 많이 사용되고 있습니다.
특히 자바에서 많이 쓰이는 것 같은데 Lombok 라이브러리에서도 빌더를 자동으로 만들어주고 있습니다.
https://projectlombok.org/features/Builder
GoF의 빌더 패턴
GoF에서 설명하는 빌더 패턴은 어떻게 다른지 알아보겠습니다.
책에 명시적으로 '의도'라고 적혀있는 부분이 있습니다!
의도
복잡한 객체를 생성하는 방법과 표현하는 방법을 정의하는 클래스를 별도로 분리하여, 서로 다른 표현이라도 이를 생성할 수 있는 동일한 절차를 제공할 수 있도록 합니다. p.144
생성 방법과 표현 방법을 분리한다.
이렇게 분리해두면 다양한 표현 방법으로 객체를 만들 수 있습니다.
예제를 보면서 패턴의 구성요소를 알아봅시다.
예제
Java 언어로 배우는 디자인 패턴 입문의 예제 입니다.
문서를 작성하는 프로그램을 만들어보겠습니다.
문서를 표현하는 방법은 두가지 입니다.
1. 글자만 있는 문서 -> TextBuilder
2. HTML 문서 -> HTMLBuilder
사용법을 보면 감이 오실텐데요.
테스트 코드를 먼저 공유합니다.
이 코드를 구현하기 위해서 이런 작업을 했습니다.
빌더의 기본 뼈대가 되는 프로토콜을 먼저 정의하겠습니다.
그리고 이 Builder를 사용해서 문서를 만들 Director를 만들어보겠습니다.
눈여겨 볼 점은 Director는 Builder protocol을 받기 때문에 구현체가 무엇인지 알지 못한다는 점 입니다.
구체적인 구현체를 알지 못한다는 것 = 교체 가능하다는 뜻 입니다.(p.131)
빌더 프로토콜을 뼈대로 여러 구현된 빌더를 만들 수 있습니다.
그리고 그 구현된 빌더들을 교체해서 사용할 수 있습니다.
Swift로 구현해본 TextBuilder는 다음과 같습니다.
Java의 StringBuffer 같은 객체는 필요없지만 네이밍 편의상 buffer라고 붙였습니다.
HTMLBuilder는 다음과 같이 구현했습니다.
책의 코드에서는 result()로 파일명을 출력하는데, 테스트 편의상 본문을 출력하도록 했습니다.
파일로 저장하는 Java의 PrintWriter와 동일한 것이 없어서 같은 역할을 해주는 객체를 만들었습니다.
구현 코드는 아래 레포에도 있습니다.
https://github.com/cozzin/DesignPattern/tree/main/DesignPattern/Builder
그런데 구현 코드보다 빌더를 통해서 다양한 표현을 해봤다는 것을 기억하면 좋겠네요.
다음엔 또 다른 패턴을 가지고 학습해보겠습니다!
읽어주셔서 감사합니다!!!
'스터디' 카테고리의 다른 글
[디자인패턴] 전광판을 예시로 풀어본 Bridge 패턴 (0) | 2021.05.24 |
---|---|
[엘레강트 오브젝트] '생성자에 코드를 넣지 마세요' 적용해보기 (0) | 2021.05.19 |
[디자인패턴] Template Method 패턴 (1) | 2021.05.05 |
[디자인패턴] Iterator 패턴을 Swift로 구현해보기 (0) | 2021.05.03 |