一、 单例模式概念、特点、应用
概念:单例模式保证在一个应用进程中一个类只有一个实例,并在这个类内自行实例化并提供一个全局的访问点。
特点:1 整个应用程序都会共享单例类的唯一的实例对象
2 单例类的构造方法是私有类型,即用private修饰,防止外部类创建单例类的实例,
只能自己创建自己的实例
3 单例类提供了静态的访问接口供外部类调用,获取单例类的唯一实例
应用:如果某个类在应用进程中只需存在一个实例就能满足需求,就可以把这个类设计成单例模式,
比如应用程序的入口类、管理操作的类(DataManager)、获取数据的类(DataHelper)
二、 单例模式的典型应用与对比
1 懒汉模式
不足1:懒汉模式在第一次调用getInstance()时才会创建实例,第一次调用时会先加载类,做初始化的工作,
之后再创建对象,如果要做的工作比较多,性能上会有些延迟。
不足2:如果在多线程的环境下,懒汉模式是线程不安全的,有可能在应用进程中出现多个实例,
比如线程A在调用getInstance()时发现mInstance为null,会创建实例,此时线程B也同时调用了 getInstance()同样发现mInstance为null,也会创建一个实例,会造成应用进程内存在多个实例对象。
多线程情况下解决懒汉模式线程安全问题,方案1:
同步getInstance()方法,保证了线程安全,但是每次调用getInstance()都要同步,
如果程中序调用getInstance()次数比较多的话,到导致程序性能下降。
方案2:
在getInstance()中做了两次null检查,确保了只有第一次调用单例的时候才会做同步,这样也是线程安全的,
同时避免了每次都同步的性能损耗。
2 饿汉模式
饿汉模式在类加载的时候就创建了静态的实例供系统使用,此实例以后不再改变,所以线程安全。
在调用getInstance()获取实例时速度也会更快,因为其资源已经初始化完成。
不足:类加载的时候就创建了静态的实例,不管之后会不会使用这个实例,都会占据一定的内存。