51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

设计模式 - 单例模式

JAVA中的单例模式 {#java%E4%B8%AD%E7%9A%84%E5%8D%95%E4%BE%8B%E6%A8%A1%E5%BC%8F}

单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来获取该实例。在JAVA中,单例模式被广泛使用,因为它可以控制对象的创建和访问,从而确保系统的稳定性和一致性。

实现方式 {#%E5%AE%9E%E7%8E%B0%E6%96%B9%E5%BC%8F}

在JAVA中,有多种方式可以实现单例模式,其中最常用的方式包括:

  1. 饿汉式:在类加载时就完成了初始化,所以类加载较慢,但获取对象的速度快。
public class Singleton {
    private static Singleton instance = new Singleton();
    private Singleton() {}
    public static Singleton getInstance() {
        return instance;
    }
}
  1. 懒汉式:类加载速度快,但运行时获取对象的速度慢,且多线程环境下可能不安全。
public class Singleton {
    private static Singleton instance;
    private Singleton() {}
    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}
  1. 双重校验锁:既保证了线程安全,又提高了执行效率。
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;
    }
}
  1. 静态内部类:利用了classloader的机制来保证初始化instance时只有一个线程,且JVM内部已经做了同步处理。
public class Singleton {
    private static class SingletonHolder {
        private static final Singleton INSTANCE = new Singleton();
    }
    private Singleton (){}
    public static final Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
}
  1. 枚举:不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象。这是Effective Java推荐的方式。
public enum Singleton {
    INSTANCE;
    public void whateverMethod() { }
}

使用场景和注意事项 {#%E4%BD%BF%E7%94%A8%E5%9C%BA%E6%99%AF%E5%92%8C%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9}

单例模式的使用场景主要包括:需要频繁创建和销毁的对象、创建对象时耗时过多或耗费资源过多、但又经常用到的对象、工具类对象、频繁访问数据库或文件的对象等。然而,过度使用单例模式可能导致系统结构不清晰,增加代码的耦合度,不利于单元测试等。因此,在使用单例模式时需要注意适度使用,并考虑其对系统结构和可维护性的影响。


赞(0)
未经允许不得转载:工具盒子 » 设计模式 - 单例模式