设计模式-单例模式

时间:2021-12-06 20:49:41

一、 单例模式概念、特点、应用

     概念单例模式保证在一个应用进程中一个类只有一个实例,并在这个类内自行实例化并提供一个全局的访问点。

特点: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()获取实例时速度也会更快,因为其资源已经初始化完成。

不足:类加载的时候就创建了静态的实例,不管之后会不会使用这个实例,都会占据一定的内存。