一、单例模式
1、定义
-
单例模式是一种创建型设计模式,它保证一个类只有一个实例,并提供一个全局访问点。
-
在单例模式中,类的构造函数被私有化,使得类不能直接被实例化。通过类的静态方法或者静态变量来实现对唯一实例的访问。
2、单例模式的主要特点包括:
- 类只有一个实例,该实例由类自身创建,并在整个生命周期内保持不变。
- 要访问该实例,必须使用单例类的静态方法或变量,避免直接实例化。
3、单例模式的应用场景包括:
- 需要确保某个类只有一个实例,并且在程序的运行过程中该实例需要被频繁访问。
- 需要全局访问某个资源,例如线程池、数据库连接等。I/O与数据库的连接。Windows里面的Task Manager(任务管理器)也是单例模式。
4、单例模式的优点包括:
- 提供全局唯一的访问点,方便其他类来访问该实例;
- 避免了重复创建实例的开销,提高了性能。
二、代码实现
1、以下是几种常见的单例模式实现案例:
- 饿汉式单例模式:
java
public class Singleton {
private static final Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
在该实现中,Singleton类的实例在类加载时就已经被创建,因此被称为饿汉式。通过getInstance()方法获取实例;没有线程安全的问题,浪费内存空间。
- 懒汉式单例模式:
java
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
在该实现中,Singleton类的实例是在第一次调用getInstance()方法时创建的,因此被称为懒汉式。通过getInstance()方法获取实例。
- 双重检查锁单例模式:
java
public class Singleton {
private volatile static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
在该实现中,通过双重检查锁的方式实现懒汉式单例模式。使用volatile关键字保证instance的可见性。保证了线程安全,又比直接上锁提高了执行效率,还节省了内存空间。
- 静态内部类单例模式:
java
public class Singleton {
private Singleton() {}
private static class SingletonHolder {
private static final Singleton instance = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.instance;
}
}
在该实现中,通过静态内部类的方式实现单例模式。在SingletonHolder内部类中创建实例,并通过getInstance()方法获取实例。
- 枚举
java
public enum Singleton {
INSTANCE;
public Singleton getInstance(){
return INSTANCE;
}
}
以上是几种常见的单例模式实现案例。每种实现方式都有各自的优劣势,具体选择哪种方式取决于实际需求。
如有不足,欢迎指出,共同进步---------------------------