본문 바로가기

Programming/Design pattern

[Design pattern] Builder pattern

Builder Pattern

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