美文网首页
0x02 - 应用最广的设计模式——单例模式

0x02 - 应用最广的设计模式——单例模式

作者: 学点东西吧6 | 来源:发表于2018-04-11 10:16 被阅读10次

1、定义

单例对象的类必须保证只有一个实例存在。
确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。

2、使用场景

避免产生对个对象消耗过多的资源,或者某种类型的对象只应该有且只有一个。

3、实现方式

  • 饿汉模式
public class CEO  {
    private static final CEO mCEO = new CEO();

    private CEO() {
    }

    public static CEO getCEO() {
        return mCEO;
    }
}
  • 懒汉模式
public class CEO  {
    private static CEO instance;

    private CEO() {
    }

    public synchronized static CEO getCEO() {
        if (instance == null) {
            instance = new CEO();
        }
        return instance;
    }
}
  • 懒汉模式 - double checkLock
public class CEO {
    private CEO() {
    }

    private static CEO instance = null;

    public static CEO getInstance() {
        //避免不必要的同步
        if (instance == null) {
            synchronized (CEO.class) {
                //同步后仍然为null,再创建
                if (instance == null) {
                    instance = new CEO();
                }
            }
        }
        return instance;
    }
}
  • 静态内部类
public class CEO {
    private CEO() {
    }

    public static CEO getInstance() {
        return CEOHolder.instance;
    }

    /**
     * 静态内部类
     * 确保线程安全,也能保证单例对象的唯一性
     * 延时了单例的初始化
     */
    private static class CEOHolder {
        private static final CEO instance = new CEO();
    }

    //防止反序列化时,可以通过反射来创建新对象
    private Object readResolve() throws ObjectStreamException {
        return getInstance();
    }
}
  • 枚举
    默认枚举实例的创建是线程安全的,并且在任何情况下它都是一个单例,包括反序列化的时候(其余的实现都会在反序列化时出现问题,静态内部类实现方式已给出解决方案 反序列化相关
public enum CEO {
    INSTANCE;
}
  • 容器
    通过统一的接口进行获取操作,降低了使用成本,及耦合度
public class SingletonManager {
    private static Map<String, Object> sObjectMap = new HashMap<>();

    private SingletonManager() {
    }

    public static void registerService(String key, Object instance) {
        if (!sObjectMap.containsKey(key)) {
            sObjectMap.put(key, instance);
        }
    }

    public static Object getService(String key) {
        return sObjectMap.get(key);
    }
}

4、Demo

Design-Patterns

5、Android 源码中的运用

android.content.Context
public final @Nullable <T> T getSystemService(@NonNull Class<T> serviceClass) 

优缺点

  • 优点
  1. 减少了内存开支
  2. 减少了系统的性能开销
  3. 避免对资源的多重占用
  4. 可以在系统设置全局的访问点,优化和共享资源访问
  • 缺点
  1. 单例模式一般没有接口,扩展性差
  2. 单例对象如果持有 Context 对象,容易引发内存泄漏,最好使用 Application Context

相关文章

  • Android中的设计模式—单例模式

    单例模式介绍 单例模式是应用最广的模式之一,也可能是很多人唯一会使用的设计模式。在应用单例模式时,单例对象的类必须...

  • 设计模式分析——(Singleton Pattern)

    单例模式介绍: 单例模式是应用最广的模式之一,也是初级程序员唯一会的设计模式。在应用这个模式时,单例对象必须保证唯...

  • 设计模式---单例模式

    1.1 单例模式介绍 单例模式可能是应用最广,最熟悉的设计模式了。这种设计模式可以确保某个类只有一个实例,并且自行...

  • 设计模式整理(2) 单例模式

    学习《Android 源码设计模式解析与实践》系列笔记 什么是单例 单例模式是应用最广,也是最容易理解的模式之一。...

  • 设计模式之单例模式

    单例模式是应用最广的设计模式之一,面试的时候常常会被要求写个单例模式的Demo,那么我今天就来看看单例模式的相关内...

  • 设计模式——单例模式

    1.单例模式介绍 单例模式是应用最广的模式,也是我最先知道的一种设计模式,在深入了解单例模式之前,每当遇到如get...

  • 设计模式读书笔记一 单例模式

    1、单例模式介绍单例模式是应用最广泛的模式之一,也是可以说是初级工程师唯一会用的设计模式。在应用这一模式的时候,单...

  • 设计模式之单例模式

    单例模式介绍 单例模式可以说是应用最广泛的模式之一,也是很多程序猿学会的第一个设计模式,在使用单例模式中,必须保证...

  • 0x02 - 应用最广的设计模式——单例模式

    1、定义 单例对象的类必须保证只有一个实例存在。确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。...

  • 单例设计模式

    单例设计模式是什么? 单例设计模式是应用最广泛的设计模式,没有之一。当我们需要控制一个类只能被创建出单个对象时,就...

网友评论

      本文标题:0x02 - 应用最广的设计模式——单例模式

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