코틀린 팩토리 패턴(Kotlin Factory Pattern) - 스프링부트

2023. 5. 9. 01:14Dev/코틀린

반응형

스프링부트에서 코틀린으로 팩토리 패턴을 구현하는 방법을 알아보자. 

아래 코드 샘플을 참고해주세요.

 

코드샘플

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