코틀린 팩토리 패턴(Kotlin Factory Pattern) - 스프링부트
2023. 5. 9. 01:14ㆍDev/코틀린
반응형
스프링부트에서 코틀린으로 팩토리 패턴을 구현하는 방법을 알아보자.
아래 코드 샘플을 참고해주세요.
코드샘플
PushType.kt (열거형 enum 클래스)
enum class PushType {
ANDROID,
IOS;
companion object {
operator fun invoke(type: String) = valueOf(type.uppercase())
}
}
PushService.kt (인터페이스 클래스)
interface PushService {
fun getPushType(): PushType;
fun savePushData() = println("default msg...")
AndroidPushServiceImpl.kt (PushService 인터페이스를 구현하는 서비스 클래스)
@Service
class AndroidPushServiceImpl() : PushService {
override fun getPushType(): PushType {
return PushType.ANDROID
}
override fun savePushData() {
//상세내용 구현
}
}
IosPushServiceImpl.kt (PushService 인터페이스를 구현하는 서비스 클래스)
@Service
class IosPushServiceImpl() : PushService {
override fun getPushType(): PushType {
return PushType.IOS
}
override fun savePushData() {
//상세내용 구현
}
}
pushFactory.kt (실제로 사용할 서비스 클래스 객체를 반환하는 팩토리 클래스)
@Service
class PushFactory(
private val pushServices: List<PushService>
) {
private val pushService = mutableMapOf<PushType, PushService>()
/**
* init 키워드를 이용하여 해당 클래스가 bean으로 등록될 때,
* PushService인터페이스를 구현하는 서비스 클래스들을 Map에 담는다.
*/
init {
// PushService 인터페이스의 구현체인 서비스 클래스 bean들을 for문을 이용하여 map에 담는다.
for (item in pushServices) {
this.pushService[item.getPushType()] = item
}
}
/**
* 푸시 메시지 유형에 따라, 서비스 객체를 생성한다
* @param pushType 푸시 메시지 유형 코드
*/
fun getService(pushType: PushType): PushService? {
return pushService.get(pushType);
}
UseService.kt (실제로 서비스를 호출하는 클래스)
@Service
class UseService(
private val pushFactory: PushFactory,
) {
/**
* 푸시 메시지의 유형에 따라, 알맞은 서비스 객체를 생성하고, 서비스를 실행시킨다.
* @param pushCode 푸시메시지 코드
*/
fun handleSavePush(pushCode: String) {
pushFactory.getService(PushType.valueOf(pushCode)?.savePushData()
}
}
나중에,
PushService 인터페이스를 구현하는 새로운 서비스 클래스가 추가되는 경우,
해당 서비스 클래스를 추가해주고, PushType 열거형 클래스에 코드값만 추가해주면 된다.
반응형
'Dev > 코틀린' 카테고리의 다른 글
[코틀린/Kotlin] 함수의 선언방법 (0) | 2022.10.30 |
---|---|
[코틀린/Kotlin] 변수의 선언방법 (0) | 2022.10.19 |