android设计模式之单例模式

一、定义

确保某一个类只有一个实例,而且自行实例化并乡整个系统提供这个实例。

二、使用场景

确保某个类有且只有一个对象的场景,避免产生多个对象消耗多个资源。或者某些类占用太多的资源,不适合创建多个对象的情况;例如:数据库、IO访问,
android中使用单例模式的类:ImageLoader

三、单例的类图

单例模式
  • 角色介绍
  1. Client 客户端类
  2. Singleton 单例类
  • 实现的关键点
  1. 构造方法设置成为私有的private;
  2. 通过静态方法或枚举类型返回单例对象;
  3. 确保线程安全;

备注:单例模式的类,有且只能有一个入口,注意尽量不要在单例模式中使用参数,尤其是传人类对象,会导致单例对象持有没必要的引用,可能导致内存泄漏。

四、代码实例

1.饿汉模式

public class Person {

    private static final Person instance = new Person();

    private Person() {
    }

    public static Person getInstance() {
        return instance;
    }
}

最简单的单例模式,但是线程不安全。

2.懒汉模式

public class Person {
   private static Person instance;
    private Person() {}

    public static synchronized Person getInstance() {
        if (instance == null) {
            instance = new Person();
        }
        return instance;
    }
}

可以保证线程安全问题,但是每一次使用getInstance()方法都会进行同步,而且第一次加载时需要进行实例化,反应稍慢;

3.Double Check Lock(DCL)实现单例模式

public class Person {
   private static volatile Person instance;
   private Person() {}

   public static Person getInstance(){
        if(instance == null){
            synchronized (Person.class){
                if(instance == null){
                    instance = new Person();
                }
            }
        }
        return instance;
    }
}

第一次判空是为了避免不必要的重复,
第二次判空是为了在null情况下创建实例;
通过俩次检测初始化对象实例,优点是仅在需要的时候会创建实例,资源利用率高,缺点由于java的内存模型的原因偶尔会失败;推荐使用volatile关键字,将对像直接写入主内存,会影响性能,但是会保证程序的准确性。

4.静态内部类实现单例模式

public class Person {
   private static volatile Person instance;
   private Person() {}
    
    public static Person getInstance(){
        return PersonHolder.instance;
    }
   //静态内部类
    private static class PersonHolder {
        private static final Person instance = new Person();
    }
}

优点:
1)第一次加载Person不会初始化;
2)第一次加载getInstance()导致虚拟机加载PersonHolder类,才会进行类的初始化;
3)可以保证线程安全,以及单例的唯一性;
4)延迟了类的实例化,推荐使用该方法。

五、android源码中的实现

  • 1.Context
  • 2.LayoutInflater
  • 3.PolicyManager
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 单例模式(SingletonPattern)一般被认为是最简单、最易理解的设计模式,也因为它的简洁易懂,是项目中最...
    成热了阅读 4,318评论 4 34
  • 源码地址说明: 此笔记是在看完 Android 源码设计模式解析与实战 中单例模式进行的总结。 使用场景 确保某个...
    yangMr阅读 497评论 0 2
  • 1 场景问题# 1.1 读取配置文件的内容## 考虑这样一个应用,读取配置文件的内容。 很多应用项目,都有与应用相...
    七寸知架构阅读 6,905评论 12 68
  • 一.什么是单例 单例对象的类必须保证只有一个实例存在 对单例的实现可以分为两大类——懒汉式和饿汉式,他们的区别在于...
    Android_Liu阅读 2,095评论 0 6
  • 前言 本文主要参考 那些年,我们一起写过的“单例模式”。 何为单例模式? 顾名思义,单例模式就是保证一个类仅有一个...
    tandeneck阅读 2,546评论 1 8