dev/aos

[AOS] 빌더 패턴 Builder Pattern 작성

캄춰 2023. 11. 17. 16:08
728x90
반응형

MVC, MVVM이런 것들을 왜 만드나 불만이 많았었지만,

모듈화와 분리 그리고 스파게티 코드를 못봐주는 레벨이 되니 이해가 되었다.

필수다.

 

 

여러 API적용하면서 분리를 하게 되었고, 구조를 짰고,

Base가 되는 추상 클래스에 필요한 리스너만 넣는 Builder패턴이 필요하게 되었다.

 

return하는 것에 대한 이해도가 있다면 Builder패턴은 정말 코드를 간결하고 깔끔하게 필요한 것만 가져다 사용할 수 있도록 만들어준다.

 

 

먼저, 클래스 내부에 Builder 클래스 생성

    inner class Builder() {
        private var loginCallback: LoginResultCallback? = null
        private var logoutCallback: LogoutResultCallback? = null

        fun addLoginResultCallback(listener: LoginResultCallback): Builder {
            loginCallback = listener
            return this@Builder
        }

        fun addLogoutResultCallback(listener: LogoutResultCallback): Builder {
            logoutCallback = listener
            return this@Builder
        }

        fun build(): LoginApiBase {
            loginResultCallback = loginCallback
            logoutResultCallback = logoutCallback
            return this@LoginApiBase
        }
    }

 

 

Builder클래스를 포함하는 추상클래스 구조 코드

abstract class LoginApiBase() {
    // 로그인 요청 결과 리스너
    protected var loginResultCallback: LoginResultCallback? = null
    protected var logoutResultCallback: LogoutResultCallback? = null

	...
}

 

 

외부에서 Builder패턴 사용

    private fun initPlatform(platform: LoginApiEnum = LoginApiEnum.NONE) {
        loginApi = when (platform) {
            LoginApiEnum.NONE -> LoginApiNone(context).Builder()
                .addLoginResultCallback(registerLoginResultCallback)
                .build()
            LoginApiEnum.GOOGLE -> LoginApiGoogle(context, activityResultGoogleLauncher).Builder()
                .addLoginResultCallback(registerLoginResultCallback)
                .addLogoutResultCallback(registerLogoutResultCallback)
                .build()
            LoginApiEnum.KAKAO -> LoginApiKakao(context).Builder()
                .addLoginResultCallback(registerLoginResultCallback)
                .addLogoutResultCallback(registerLogoutResultCallback)
                .build()
            LoginApiEnum.NAVER -> LoginApiNaver(context).Builder()
                .addLoginResultCallback(registerLoginResultCallback)
                .addLogoutResultCallback(registerLogoutResultCallback)
                .build()
        }
    }

 

 

 

보통 constructor(builder : Builder) : this( ) { }

이런식의 사용도 간결하지만, abstract 추상클래스에서 사용이 불가하기 때문에 위와 같이 return을 Builder로 주고,

마지막 'build'하는 구간에서 반환하고자 하는 클래스를 넣어서 완성시켰다. 그 맥락은 동일

728x90
반응형