빌더 패턴 (Builder Pattern)
- 복합 객체의 생성 과정과 표현 방법을 분리하여 동일한 생성 절차에서 서로 다른 표현 결과를 만들 수 있게 하는 패턴
- 생성(Creational) 패턴 중 하나로써 복합 객체의 생성 과정과 표현 방법을 분리하여 동일한 생성 절차에서 서로 다른 표현 결과를 만들 수 있게 하는 패턴
장점
- 별도의 Builder 객체에서 복잡한 객체의 일부를 만들고 조합하는 걸 캡슐화 함
- 클래스는 객체를 직접 생성하는 대신 Builder 객체에 객체 생성을 위임함
- 가독성 : 각 인자의 의미를 파악하기 쉬움
- 유연성 : 필수 매개변수, 선택적 매개변수를 통해 객체를 생성할 때 보다 유연하게 활용 할 수 있음
사용 이유
- 인자가 많다면 각각 인자의 의미를 알 수 없게 됨
- 생성자를 여러 개 만들어야 하는 경우가 있음
- 아래와 같은 예시에서 객체를 생성할 때 데이터를 몇 번째 파라미터에 넣어야 할지 헷갈리는 경우가 있기 때문에 사용하는 것
class Member {
constructor(name: String, sex: String) {
this.name = name
this.sex = sex
this.age = 0
this.job = ""
this.address = ""
this.weight = 0
this.height = 0
}
constructor(name: String, sex: String, age: Int, job: String, address: String, weight: Int, height: Int) {
this.name = name
this.sex = sex
this.age = age
this.job = job
this.address = address
this.weight = weight
this.height = height
}
}
val member = Member("Lion", "남", 20, "학생", "서울", 60, 160)
사용법
작성할 클래스 내부에 Builder 클래스를 따로 만듦
class Member {
private var name: String = ""
private var gender: String = ""
private var age: Int = 0
private var job: String = ""
class Builder(
val name: String
) {
var sex = "여"
var age = 26
var job = ""
fun sex(sex: String): Builder {
return this.sex = sex
return this
}
fun age(age: Int): Builder {
this.age = age
return this
}
fun job(job: String): Builder {
this.job = job
return this
}
fun build(): Member {
return Member(this)
}
}
constructor(builder: Builder) {
name = builder.name
sex = builder.sex
age = builder.age
job = builder.job
}
}
객체 생성 방법
val member = Member.Builder("권민채")
member.sex("여")
member.age(26)
member.job("취준생)
val minchae = member.build()
val member = Member.Builder("권민채")
.sex("여")
.age(26)
.job("취준생")
.build()