일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Design Pattern
- r
- ㅓ
- designPattern
- builderPattern
- 디자인패턴 #
- 디자인패턴
- 옵저버 패턴
- Singleton
- 추상팩토리패턴
- 팩토리 메소드
- a
- 빌터패턴
- Kotlin
- Abstract Factory
- Observer Pattern
- 함수형프로그래밍
- PrototypePattern
- 프로토타입 패턴
- 추상 팩토리
- factory method
- ㅋㅁ
- Functional Programming
- 싱글톤
- F
- El
- 코틀린
- Today
- Total
오늘도 더 나은 코드를 작성하였습니까?
Builder Pattern(feat. kotlin) 본문
정의
빌더 패턴은 객체 지향 프로그래밍의 다양한 객체 생성 문제에 대한 유연한 솔루션을 제공하기 위해 설계된 디자인 패턴이다.
빌더 디자인 패턴의 목적은 "복잡한 객체의 구성과 표현을 분리하는 것"입니다.
구현
예를들어, 자동차와 같은 많은 속성을 가지고 있는 객체가 있다고 생각해보자.
그렇다면, 생성을 하는 과정과 사용함에 있어 여러가지 불편함이 생기게 된다.
- 해당 객체를 생성하는 곳에서 자동차 클래스의 속성을 다 알고 있어야 한다.
- 너무 많은 속성 중에 일부는 기본값을 제공한다면, 많은 생성자가 오버로딩 되어질 수 있다.
(kotlin에서는 parms에 기본값을 제공하는 기능을 제공한다)
위의 2개의 문제를 해결하기 위해 그럼 Builder Patter을 사용해보자!
1. Builder Interface를 통해 객체를 생성에 반드시 필요한 단계의 정의한다
interface CarBuilder {
fun model(model: String): CarBuilder
fun color(color: String): CarBuilder
fun tire(tire: String): CarBuilder
fun navigation(navigation: String? = null): CarBuilder
fun seatCover(seatCover: String): CarBuilder
fun build(): Car
}
2. Interface를 구현하는 클래스는 생성할 객체의 속성들과 동일한 속성들을 private 접근자를 달아 선언하고, 필요하다면 기본값을 제공한다. Interface에 정의된 객체 설정에 단계를 구현한다.
class HyundaiCarBuilder(): CarBuilder {
private val brand: String = "hyundai"
private var model: String = ""
private var color: String = "white"
private var tire: String = "hankook"
private var navigation: String? = null
private var seatCover: String = "Leatherette"
override fun model(model: String): CarBuilder {
this.model = model
return this
}
override fun color(color: String): CarBuilder {
this.color = color
return this
}
override fun tire(tire: String): CarBuilder {
this.tire = tire
return this
}
override fun navigation(navigation: String?): CarBuilder {
this.navigation = navigation
return this
}
override fun seatCover(seatCover: String): CarBuilder {
this.seatCover = seatCover
return this
}
override fun build(): Car {
return Car(brand, model, color, tire, navigation, seatCover)
}
}
3. 기존의 Car 클래스는 생성자는 kotlin의 경우 모듈내에서만 생성할 수 있도록 Inline, java의 경우 패키지 가시성인 protected 키워드를 이용하여 제한하고 모든 속성은 private로 감춰줍니다.
class Car internal constructor (
private val brand: String = "",
private val model: String = "",
private var color: String = "",
private var tire: String = "",
private var navigation: String? = null,
private var seatCover: String = ""
)
사용하는 곳에서는 아래와 같이 사용할 수 있다.
fun main() {
val myCar = HyundaiCarBuilder()
.model("Genesis")
.color("black")
.seatCover("natural calf leather")
.build()
}
Director란??
- Builder Pattern을 사용하면서 자주 반복되어 사용되는 객체의 구성을 미리 그 값과 순서를 정의를 하여, 재사용하기 편리하게 도와준다!
- Builder Pattern 사용할때, 옵셔널하며, 꼭 필요하지 않다면 없어도 된다.
class Director {
companion object{
fun buildBasicAvante(builder: CarBuilder): Car=
builder
.model("Avante")
.color("White")
.tire("NoBrand")
.navigation(null)
.seatCover("Leatherette")
.build()
fun buildFullOptionAvante(builder: CarBuilder): Car=
builder
.model("Avante")
.color("White")
.tire("KumHO")
.navigation("inavi")
.seatCover("High-quality calfskin")
.build()
}
}
'디자인패턴 > 생성패턴' 카테고리의 다른 글
Prototype Pattern(feat. kotlin) (0) | 2024.06.10 |
---|---|
Abstract Factory Pattern 추상 팩토리 패턴 (feat. kotlin) (0) | 2024.06.04 |
Factory Method Pattern 팩토리 메소드 패턴 (feat. kotlin) (1) | 2024.06.02 |
Singleton pattern 싱글톤 패턴(feat. kotlin) (0) | 2024.05.30 |
SimpleFactory pattern (0) | 2021.12.28 |