티스토리 뷰

반응형

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()
        }
    }
}

계획 단계에서 호텔이나 예약 날짜가 변경하여도 생성 전 단계이기에 마지막으로 수정된 정보로 생성되게 됩니다.

 

마치며

빌더 패턴에 대해서 알아봤습니다. 이번 포스트는 간단한 빌더 패턴이고 해당 빌더패턴 개념을 갖고 더 복잡하게 구성할 수 있습니다.

유연한 디자인이 필요 시 생성 패턴인 빌더 패턴 구성을 고려해보는 것도 좋을거 같습니다.

반응형
댓글