美文网首页Android-Rxjava&retrofit&daggerAndroid-Dagger2
Dagger2配合Application拓展类实现单例模式

Dagger2配合Application拓展类实现单例模式

作者: HWilliamgo | 来源:发表于2018-07-02 21:05 被阅读24次

需要提前了解Dagger2的@Singleton@Component依赖。

介绍

Android中的单例模式,可以通过继承Application类,在onCreate中初始化单例类,然后将单例类的引用通过getXXX()发布出去。
Application类提供了天然的单例模式。

但是,如果我们有10个单例类,那么就需要

  1. Application类里面写10个引用,
  2. 10个getXXX()方法
  3. onCreate()中10个单例类的初始化

缺点

  1. 当需求变动,要更换实现类的时候,要在Application里面做修改
  2. onCreate()中初始化的10个单例类,并不是马上就要用的,更好的做法是,要用到他们的时候才实例化他们,但是在onCreate()中实例化,则必须将10个类一次性提前全部实例化。

用Dagger2解决上述两个缺点

  1. 依赖Dagger2
  2. 将10个单例类从Application类中移除
  3. 创建ApplicationComponent类,并用@Component@Singleton标注,在ApplicationComponent中写带返回值的方法(用于别的Component类来依赖,或者自己要用的时候调用),不写void inject(上下文)方法,因为不需要在onCreate中立刻实例化那10个单例类。
  4. 创建ApplicationModule类,标注@Module,写好工厂方法并标注@Provides@Singleton,回到ApplicationComponent,加上这个ApplicationModule.class
  5. onCreate中实例化ApplicationComponent,并用getApplicationComponent(),将该component对象发布出去。

那么这个时候,在别处任何地方通过该ApplicationComponent对象来依赖注入的任何对象,都是单例的。
而且别的Component还可以依赖ApplicationComponent来拓展自己的依赖注入范围,且通过拓展而来的那些依赖注入来的对象,依然是单例的。
好处

  1. 大大缩减了Application类的代码量。
  2. 当后期需求变动,要改单例类的实现时,只要改ApplicationModule中的工厂方法即可。

相关文章

  • Dagger2配合Application拓展类实现单例模式

    需要提前了解Dagger2的@Singleton 和 @Component依赖。 介绍 Android中的单例模式...

  • 单例模式

    什么是单例模式? 一个类只允许创建一个实例,那个类就是单例类。这个模式就是单例模式。单例模式实现方式:饿汉式:实现...

  • python面试题-2018.1.30

    问题:如何实现单例模式? 通过new方法来实现单例模式。 变体: 通过装饰器来实现单例模式 通过元类来创建单例模式...

  • 【设计模式】单例模式

    单例模式 常用单例模式: 懒汉单例模式: 静态内部类单例模式: Android Application 中使用单例模式:

  • 单例模式和GCD单例实现

    1、传统单例模式2、GCD单例模式3、用宏实现GCD单例模式4、用宏实现GCD单例模式,名称随类名变化而变化 单例...

  • 单例模式

    1.利用装饰器实现单例模式 2.修改new方法实现单例模式 3.利用元类实现单例模式 总结: 用装饰器和元类实现的...

  • 单例模式之枚举类enum

    通过枚举实现单例模式 枚举类实现单例模式的优点 对于饿汉式单例模式和懒汉式单例模式了解的同学,使用以上两种单例模式...

  • Python两种方式实现单例模式

    装饰器模式实现单例 通过拦截类创建的是模式实现单例 测试结果

  • 设计模式--单例模式

    单例模式概述 单例模式实现方式 为什么要使用单例模式 单例模式实现方式 饿汉式 类加载后就会将对象加载到内存中,保...

  • 单例模式(双重锁定模式)

    主方法 单例模式实现类 线程类

网友评论

    本文标题:Dagger2配合Application拓展类实现单例模式

    本文链接:https://www.haomeiwen.com/subject/ktqruftx.html