概念
单例模式其实是设计模式中最简单的,很容易理解,它只包含一个类。在考虑下一个设计模式写哪个的时候,也在犹豫是否要介绍单例模式,因为确实比较简单,不知道从哪里去介绍它,所以这一篇可能会比较简单。
确保一个类只有一个实例,并提供一个全局访问点来访问这个唯一实例
解释
不知道从何说,就直接写上代码吧
public class SIngleton {
private static Singleton instance = null;
private Singleton() {
}
private static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
额…应该很容易理解,单例模式保证一个类有且仅有一个实例,并提供一个全局的访问点,确保只有一个实例会被创建。网站的计数器、线程池的设计等等通常也是采用单例模式。
在学习单例模式的时候,我们需要了解一下以下两种类型:
- 饿汉式单例
- 懒汉式单例
饿汉式单例:在类加载的时候立刻会实例化,使用只会出现一份实例。
懒汉式单例:在类加载的时候没有直接实例化,而是调用指定实例方法的时候再进行实例化,这样就能保证不想使用的时候也不会实例化。
饿汉式与懒汉式的比较:
由于饿汉式单例类在类加载是就被实例化,因此在对于多线程场景下,可以确保唯一性,因此它是线程安全的,但从系统的加载效率上来讲,饿汉式会比懒汉式的效率低,但由于懒汉式是在使用时才进行实例化,在多线程同时访问时,不能确保只有一个实例,因此有可能会造成线程不安全,当然我们可以通过双重检查锁定等机制进行,这里就不深入讲解,有兴趣的可以自行去了解。
缺点
- 扩展困难
- 职责过重,违背单一职责原则
- 对于某些拥有自动垃圾回收机制的语言,长时间不使用感想对象,容易被误认为垃圾自动销毁并且回收
适用场景
- 系统只需要一个实例对象
- 只允许一个公共访问点,不允许其他途径访问。
上期答案
B
一问三不知
单例模式的三个要点是什么?