interface ServiceLocator { companion object { private val LOCK = Any() private var instance: ServiceLocator? = null fun instance(context: Context): ServiceLocator { synchronized(LOCK) { if (instance == null) { instance = RepositoryServiceLocator( applicationContext = context.applicationContext) } return instance!! } } @VisibleForTesting fun swap(locator: ServiceLocator) { instance = locator } } fun getRepository(repositoryType: RepositoryType): BaseRepository<*> } open class RepositoryServiceLocator(val applicationContext: Context) : ServiceLocator { private val sharedPrefsRepository by lazy { SharedPreferencesRepository(applicationContext) } private val bookingSessionDataRepository by lazy { BookingSessionDataRepository((applicationContext as Application).sessionManager) } private val helloRepository: HelloRepository by lazy { HelloRepository((applicationContext as Application).sessionManager) } private val loginRepository: LoginRepository by lazy { LoginRepository((applicationContext as Application).sessionManager) } override fun getRepository(repositoryType: RepositoryType): BaseRepository<*> { return when (repositoryType) { RepositoryType.SHARED_PREFS -> sharedPrefsRepository RepositoryType.BOOKING_SESSION -> bookingSessionDataRepository RepositoryType.HELLO -> helloRepository RepositoryType.LOGIN -> loginRepository RepositoryType.NOT_DEFINED -> sharedPrefsRepository } } }