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

单例模式

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


1.定义:

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

2.应用实例:

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

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

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

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

3.类图

4.实现方式:

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

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

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

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

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

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

(3)饿汉式

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

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

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

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

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

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

描述:

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

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

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值