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
반응형
'dev > aos' 카테고리의 다른 글
[AOS] FCM(Firebase Cloud Messaging) 구축 (0) | 2023.11.23 |
---|---|
[AOS] 초록줄, 노란줄 제거 방법 (0) | 2023.11.22 |
[AOS] lateinit 초기화 여부 확인 (0) | 2023.11.16 |
[AOS] 액티비티 뒤로가기(onBackPressed: Deprecated) (0) | 2023.11.14 |
[AOS] 액티비티 애니메이션(Activity Animation) (0) | 2023.11.14 |