设计模式 - Singleton 单例模式(创建型)

单例模式

属于创建型模式,这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一对象的方式,可以直接访问,不需要实例化该类的对象。


1.定义:

单例模式:确保一个类最多只有一个实例,并提供一个全局访问点。

2.应用实例:

       (1)Windows 是多进程多线程的,在操作一个文件的时候,就不可避免地出现多个进程或线程同时操作一个文件的现象,所以所有文件的处理必须通过唯一的实例来进行。

       (2)一些设备管理器常常设计为单例模式,比如一个电脑有两台打印机,在输出的时候就要处理不能两台打印机打印同一个文件。

       (3)当某类需要频繁实例化,而创建的对象又频繁被销毁的时候,如多线程的线程池。

       (4)当对象需要被共享的场合。由于单例模式只允许创建一个对象,共享该对象可以节省内存,并加快对象访问速度。如 Web 中的配置对象、数据库的连接池等。

3.类图

设计模式 - Singleton 单例模式(创建型)

4.实现方式:

(1)懒汉式(线程不安全)

描述:1)线程不安全,不支持多线程。

    2)Lazy初始化,第一次调用才初始化,避免内存浪费。

设计模式 - Singleton 单例模式(创建型)

(2)懒汉式(线程安全)

描述:1)线程安全,支持多线程,但必须加锁 synchronized 才能保证单例,加锁会影响效率,每次访问时都要同步,会影响性能,且消耗更多的资源,因此应用在getInstance()方法使用不太频繁的情况下。

          2)Lazy初始化,第一次调用才初始化,避免内存浪费。

设计模式 - Singleton 单例模式(创建型)

(3)饿汉式

描述:1)在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变,所以是线程安全的。

           2)对象在类加载时就实例化,容易产生垃圾对象,浪费内存。

设计模式 - Singleton 单例模式(创建型)

(4)双检锁/双重校验锁

描述:1)采用双锁机制,线程安全且在多线程情况下能保持高性能。

           2)Lazy初始化,第一次调用才初始化,避免内存浪费。

设计模式 - Singleton 单例模式(创建型)

(5)登记式/静态内部类

描述:

利用了 classloader 机制来保证初始化 instance 时只有一个线程,它跟饿汉式不同的是:饿汉式只要 Singleton 类被装载了,那么 instance 就会被实例化(没有达到 lazy loading 效果),而这种方式是 Singleton 类被装载了,instance 不一定被初始化,因为静态内部类 SingletonHolder 没有被主动使用,只有通过显式调用 getInstance 方法时,才会显式装载 SingletonHolder 类,从而实例化 instance。

想象一下,如果实例化 instance 很消耗资源,所以想让它延迟加载,另外一方面,又不希望在 Singleton 类加载时就实例化,因为不能确保 Singleton 类还可能在其他的地方被主动使用从而被加载,那么这个时候实例化 instance 显然是不合适的。

设计模式 - Singleton 单例模式(创建型)