Builder Pattern
빌더 패턴은 추상 팩토리 패턴이나 팩토리 메소드 패턴처럼 새로운 객체를 만들어서 반환하는 패턴이긴 하지만 실제 동작 방식은 조금 다르다. 빌더 패턴은 생성자에 들어갈 매개 변수가 많든 적든 차례차례 매개 변수를 받아들이고, 모든 매개 변수를 받은 뒤에 이 변수들을 통합해서 한번에 사용한다.
Builder pattern으로 해결할 수 있는 것
- 불필요한 생성자를 만들지 않고 객체를 만든다.
- 데이터의 순서에 상관 없이 객체를 만들어 낸다.
- 사용자가 봤을때 명시적이고 이해할 수 있어야 한다.
builder pattern의 예시
- Retrofit
- Observable
- Glide, Picasso
- …
참고 : 빌더 패턴(Builder Pattern), [pattern 04] 빌더 패턴-마지막에 () 빼야함
Android Example
요구사항 : Change 버튼을 누르면 ViewState 인스턴스를 만들고, 이 인스턴스 어딘가에 전달하면 거기서 ViewState 안에있는 값을 가지고 1,2,3을 숨기고 보여주기
ViewState 클래스
class ViewState private constructor(builder: Builder) {
val state1 = builder.state1
val state2 = builder.state2
val state3 = builder.state3
class Builder {
var state1: Boolean = false
var state2: Boolean = false
var state3: Boolean = false
fun checkOne(state: Boolean): Builder {
state1 = state
return this
}
fun checkTwo(state: Boolean): Builder {
state2 = state
return this
}
fun checkThree(state: Boolean): Builder {
state3 = state
return this
}
fun build() = ViewState(this)
}
}
MainActivity
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
buttonChange.setOnClickListener {
setupView(checkList())
}
buttonClear.setOnClickListener {
setupView(checkList(true))
}
}
private fun checkList(clear: Boolean = false): ViewState {
val builder = ViewState.Builder()
if (!clear) builder.checkOne(check1.isChecked)
.checkTwo(check2.isChecked)
.checkThree(check3.isChecked)
return builder.build()
}
// 코틀린 버전 checkList
private fun checkList2(clear: Boolean = false): ViewState {
return ViewState.Builder().apply {
if (!clear) {
checkOne(check1.isChecked)
checkTwo(check2.isChecked)
checkThree(check3.isChecked)
}
}.build()
}
private fun setupView(viewState: ViewState) {
if (viewState.state1) textView1.visibility = View.VISIBLE
else textView1.visibility = View.GONE
if (viewState.state2) textView2.visibility = View.VISIBLE
else textView2.visibility = View.GONE
if (viewState.state3) textView3.visibility = View.VISIBLE
else textView3.visibility = View.GONE
}
}
'Programming > Design pattern' 카테고리의 다른 글
[Design pattern] Factory method pattern (0) | 2021.07.05 |
---|---|
[Design pattern] Adapter pattern (0) | 2019.01.02 |
[Design pattern] Singleton pattern (0) | 2019.01.02 |
[Design pattern] Observer pattern (0) | 2019.01.02 |