Android 簡單服務定位器模式實現

依賴註入(Dependency Injection)和服務定位器(Service Locator)是實現控制反轉(Inversion of Control)的兩種主要手段。

Android的主流依賴註入框架有:Dagger 和 Kion

這些依賴註入框架都感覺比較重。

服務定位器比如少見,這裡提供一個一個簡單的服務定位器模式實現。

引入

項目地址:github.com/czy1121/ser…

repositories { 
  maven { url "https://gitee.com/ezy/repo/raw/android_public/"}
} 
dependencies {
  implementation "me.reezy.jetpack:servicelocator:0.4.0" 
}

API

// 獲取實例
inline fun <reified T> resolve(name: String = T::class.java.name): T?
// 註冊為單例
inline fun <reified T> singleton(name: String = T::class.java.name, crossinline block: () -> T)
// 註冊為工廠
inline fun <reified T> factory(name: String = T::class.java.name, crossinline block: () -> T)

使用

單例,每次resolve獲得的都是同一實例

class SomeService {
  fun doSomething() {
  }
}

// 註冊 
singleton {
  SomeService()
}

// 獲取
val service = resolve<SomeService>() 

具名單例

class NamedService(val name: String) {
  fun doSomething() {
  }
}

// 註冊 
singleton("a") {
  NamedService("aaa")
}
singleton("b") {
  NamedService("bbb")
}

// 獲取 
val serviceA = resolve<NamedService>("a")
val serviceB = resolve<NamedService>("b")

工廠,每次resolve都會產生新實例

class SomeService {
  fun doSomething() {
  }
}

// 註冊 
factory {
  SomeService()
}

// 獲取,每次resolve都會產生新實例
val service1 = resolve<SomeService>() 
val service2 = resolve<SomeService>() 

具名工廠

class NamedService(val name: String) {
  fun doSomething() {
  }
}

// 註冊 
factory("a") {
  NamedService("aaa")
}
factory("b") {
  NamedService("bbb")
}

// 獲取
// A1 與 A2 是使用同一工廠產生的不同實例
// A1 與 B1 是使用不同工廠產生的不同實例
val serviceA1 = resolve<NamedService>("a")
val serviceA2 = resolve<NamedService>("a")
val serviceB1 = resolve<NamedService>("b")
val serviceB2 = resolve<NamedService>("b")

以上就是Android 簡單服務定位器模式實現的詳細內容,更多關於Android 簡單服務定位器模式的資料請關註WalkonNet其它相關文章!

推薦閱讀: