不管是在开发还是面试过程中,单例模式出现的频率都非常的高。但很多人对单例模式一知半解,单例模式的写法非常多,不同写法的区别很大,这篇文章的目的是带你深入学习一下单例模式。
什么是单例模式
单例模式是一种对象创建型模式,用来编写一个类,在整个应用系统中只能有该类的一个实例对象。
UML 结构图:
单例模式的三要点:
1、某个类只能有一个实例
2、必须自行创建这个实例
3、必须自行向整个系统提供这个实例
单例模式的特点
优点:
使用单例模式可以减少内存的开销,避免了对象实例的频繁创建和销毁。
缺点:
-
由于单例模式中没有抽象层,因此单例类的扩展有很大的困难。
-
单例类的职责过重,在一定程度上违背了"单一职责原则"。
单例模式的各种写法
1、饿汉式单例类
饿汉式比较简单,对象在类加载时就实例化,因此称为饿汉式单例类。
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton (){
}
public static Singleton getInstance() {
return instance;
}
}
优点:线程安全,没有加锁,执行效率高。
缺点:未使用单例类时,造成内存浪费。
2、懒汉式单例类
在需要使用单例类时在创建实例对象,所有称为懒汉式单例类。
public class Singleton {
private static Singleton instance;
private Singleton (){
}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
优点:节约内存
缺点:线程不安全,多线程可能会创建多个实例
3、同步方法的懒汉式单例类
在 getInstance()
方法前增加关键字 synchronized。
public class Singleton {
private static Singleton instance;
private