设计模式之单例模式
Java中的单例模式(Singleton Pattern)是一种创建型设计模式,它保证一个类只有一个实例,并提供一个全局访问点。
实现单例模式通常有两种方式:懒汉式和饿汉式。
懒汉式单例模式是指在需要实例化对象时才进行实例化,在实例化之前,该类没有被实例化。常见的懒汉式实现方式有双重检查锁和静态内部类。
// 双重检查锁实现
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;
}
}
// 静态内部类实现
public class Singleton {
private Singleton() {}
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
}
饿汉式单例模式则是在类加载的时候就创建了一个实例,因此可以保证实例的唯一性。常见的饿汉式实现方式有静态常量和静态代码块。
// 静态常量实现
public class Singleton {
private static final Singleton INSTANCE = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return INSTANCE;
}
}
// 静态代码块实现
public class Singleton {
private static final Singleton INSTANCE;
static {
INSTANCE = new Singleton();
}
private Singleton() {}
public static Singleton getInstance() {
return INSTANCE;
}
}
无论哪种实现方式,都需要注意线程安全和反序列化等问题。
应用场景:
1、需要限制一个类只能有一个实例,例如线程池、缓存、对话框、日志等。
2、在一个应用程序中,如果有多个实例会导致状态不一致的情况,使用单例模式可以避免这种情况。
3、在某些情况下,系统资源的使用需要限制,例如数据库连接池、线程池等,使用单例模式可以控制系统资源的数量。
4、当我们希望在整个系统中,某个类的对象只存在一个时,可以考虑使用单例模式。
总之,当我们需要保证全局只有一个对象实例,并且需要方便的访问该对象时,可以考虑使用单例模式。