티스토리 뷰
Head First - Design Patterns 의 템플릿 메소드 패턴 기반으로 작성하였습니다. 자세한 설명은 도서를 참고해주세요.
레거시코드를 보다보면 한번쯤은 보셨을 패턴인 빌더 패턴에 대해서 이번 시간 이야기하겠습니다.
빌더패턴이란??
제품을 여러 단계로 나눠서 만들 수 있도록 제품 생산 단계들을 캡술화하고 싶다면 빌더 패턴을 활용하면 됩니다.
◆ 장점
‣ 복합 객체가 생성되는 과정을 캡술화 합니다.
‣ 제품의 내부 구조를 클라이언트로부터 보호 할 수 있습니다.
‣ 여러 단계와 다양한 절차를 통해서 객체 생성가능합니다.
◆ 단점
‣ 팩토리를 사용하는 경우에 비해 객체를 만들기 위해서 클라이언트에 대해 더 많이 알아야합니다.
예제를 통한 빌더패턴을 알아보기
손님마다 휴일 일자와 숙소가 달라지게 됩니다. 예를들어서 고객 A가 예약한 날짜와 호텔, 고객 B가 예약한 날짜와 호텔은 다를 수 있습니다.
또한 A 고객과 B 고객의 예약 계획표 단계를 섞이지 않고 계획표를 효과적으로 할 수 있는 방법으로 빌더패턴을 사용하려고 합니다.
클라이언트에서 빌더에게 계획표 생성을 요청 합니다.
클라이언트는 추상 인터페이스를 통해서 계획표를 만듭니다.
class Client {
fun constructPlanner(): Vacation{
val builder = VacationBuilder()
builder.buildDay("2021-01-01")
builder.addHotel(StarHotel())
builder.buildDay("2022-01-01") // date을 잘못 입력 시 변경할 수 있다.
return builder.vacation
}
}
빌더 구성은 이렇게 구성됩니다.
/**
* 추상 빌더
*/
abstract class AbstractBuilder {
abstract fun buildDay(date: String)
abstract fun addHotel(hotel: Hotel)
}
/**
* 구상 빌더
*/
class VacationBuilder : AbstractBuilder() {
var hotel: Hotel? = null
var date: String? = null
val vacation: Vacation
get() {
val vacation = Vacation()
vacation.hotel = hotel
vacation.date = date
return vacation
}
override fun buildDay(date: String) {
this.date = date
}
override fun addHotel(hotel: Hotel) {
this.hotel = hotel
}
}
다양한 호텔을 위해서 Interface로 호텔을 구성합니다.
interface Hotel{
fun displayName(): String
}
class StarHotel(): Hotel{
override fun displayName() : String{
return "스타호텔"
}
}
마지막 실행을 위한 Main() fuction 구성합니다.
import Client
/**
* 빌드패턴
*/
class MainApplication {
companion object {
val TAG = MainApplication::class.simpleName
@JvmStatic fun main(args : Array<String>) {
val vacationClientA = Client().constructPlanner()
vacationClientA.print()
}
}
}
계획 단계에서 호텔이나 예약 날짜가 변경하여도 생성 전 단계이기에 마지막으로 수정된 정보로 생성되게 됩니다.
마치며
빌더 패턴에 대해서 알아봤습니다. 이번 포스트는 간단한 빌더 패턴이고 해당 빌더패턴 개념을 갖고 더 복잡하게 구성할 수 있습니다.
유연한 디자인이 필요 시 생성 패턴인 빌더 패턴 구성을 고려해보는 것도 좋을거 같습니다.
'프로그래밍 > Design Patterns' 카테고리의 다른 글
플라이웨이트(Flyweight) 패턴 (0) | 2022.01.26 |
---|---|
역할 사슬(Chain of Responsibility) 패턴 (0) | 2022.01.21 |
브리지(Bridge) 패턴 (0) | 2022.01.14 |
템플릿 메소드 패턴 (0) | 2021.09.27 |
데코레이터 패턴(Decorator Pattern) (0) | 2021.08.09 |
- IOS
- 패턴
- 임용고시
- 점수판
- 스코어헬퍼
- missionchina
- 코틀린
- Android Studio
- 선교
- push
- issue
- 고시문헬퍼
- 안드로이드
- 알고리즘
- swift
- 탁구
- java
- IT
- Android
- MCC
- 디자인패턴
- Kotlin
- view
- RXjava
- DI
- missioon
- 고시문
- 미션차이나센터
- flutter
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |