Android 单例简介

  • 1、单例类只能有一个实例。
    2、单例类必须自己创建自己的唯一实例。
    3、单例类必须给所有其他对象提供这一实例。

  • 步骤 1 创建一个 Singleton 类。

public class SingleObject {
 
   //创建 SingleObject 的一个对象
   private static SingleObject instance = new SingleObject();
 
   //让构造函数为 private,这样该类就不会被实例化
   private SingleObject(){}
 
   //获取唯一可用的对象
   public static SingleObject getInstance(){
      return instance;
   }
 
   public void showMessage(){
      System.out.println("Hello World!");
   }
}
  • 步骤 2 从 singleton 类获取唯一的对象。
public class SingletonPatternDemo {
   public static void main(String[] args) {
 
      //不合法的构造函数
      //编译时错误:构造函数 SingleObject() 是不可见的
      //SingleObject object = new SingleObject();
 
      //获取唯一可用的对象
      SingleObject object = SingleObject.getInstance();
 
      //显示消息
      object.showMessage();
   }
}
  • 饿汉式
Android 单例简介_第1张图片
  • 懒汉式
Android 单例简介_第2张图片
  • 懒汉式与饿汉式的区别:

懒汉式:实名一个静态对象,并且在用户第一次调用getInstance 时进行初始化,优点:单例只有在使用时才会被实例化,一定程度上节约了资源。缺点:是第一次加载时需要及时进行实例化,反应稍慢,最大的问题是每次调用getInstance 都进行同步,造成不必要的同步开销。一般不建议这么用。

饿汉式:是在声明静态对象时就已经初始化。

  • 双检索 Double Check Lock (DCL)实现单例
    DCL 的优点,资源利用率高,第一次执行getInstance 时才会被实例化,效率高。缺点:第一次加载反应慢,也由于java 内存 模型的原因偶尔会失败,在高并发环境下,有一定缺陷,虽然发生概率很小。(很常用)
Android 单例简介_第3张图片
  • 枚举单例
Android 单例简介_第4张图片

你可能感兴趣的:(Android 单例简介)