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其它相關文章!
推薦閱讀:
- Spring中propagation的7種事務配置及說明
- SpringBean依賴和三級緩存的案例講解
- Spring 父類變量註入失敗的解決
- 詳解JDK9特性之JPMS模塊化
- 老生常談spring的事務傳播機制