Java设计模式之单例模式的实现

单例模式:

单例模式的主要优点就是节约系统资源、提高了系统效率,同时也能够严格控制客户对它的访问。

  • Java限制了类的实例,保证了JVM中只能存在一个某个类的一个实例
  • 单实例类必须提供一个访问该实例的全局方法(其实就是public static)
  • 单例模式使用在日志(logging),驱动(driver),缓存(caching),线程池(thread pool)
  • Singleton设计模式也用于其他设计模式,如Abstract Factory,Builder,Prototype,Facade等

1 单例模式的特征

  • 私有化构造器,防止从其他类中构造实例;

  • 私有化该静态单例

  • 定义public static的get方法获取该单例,便于从其他类中获取该实例;

    总结起来就是:1、只有一个实例; 2、自我实例化; 3、提供全局访问点

2 单例模式的实现

  1. 急切的初始化 (饿汉模式)
  2. 延迟初始化 (懒汉模式)
  3. Bill Pugh 单例实现(内部托管模式)

2.1 饿汉模式(EagerInitializedSingleton)

类加载时直接创建实例,不管会不会被使用(final保证了多线程时的可见性)。缺点是可能会造成不必要的内存消耗

public class EagerInitializedSingleton {
    //私有化该实例
    private static final EagerInitializedSingleton instance = new EagerInitializedSingleton();
    //私有化构造器防止该类被其他类实例化
    private EagerInitializedSingleton() {
    }
    //提供getter方法
    public static EagerInitializedSingleton getInstance() {
        return instance;
    }
}

2.2 懒汉模式(ThreadSafeSingleton )

当要使用对象时才会创建对象(public static方法),最初的懒孩子实现方法没有加同步锁synchronized,这样造成多线程不安全。下面的方法使用双重检查锁定原理,保证了绝对安全的同时尽可能的减少了开销。

public class ThreadSafeSingleton {
    private static ThreadSafeSingleton instance=null;
    private ThreadSafeSingleton() {
    }
    public static ThreadSafeSingleton getInstance() {
        if (instance == null) {//上锁前判断实例是否已经存在
            synchronized (ThreadSafeSingleton.class) {
                if (instance == null) {
                    instance = new ThreadSafeSingleton();
                }
            }
        }
        return instance;
    }
}

2.3 内部托管模式(BillPughSingleton )

这种方法创建单实例被广泛应用,你无须因为多线程环境而同步(synchronized)。该类中有一个静态内部内SingletonHelper,并在里面实现了对象的初始化,当类创建时静态内部类不会被加载,只有当getInstance方法被调用时,内部内才会被加载

public class BillPughSingleton {
    private BillPughSingleton() {
    }
    private static class SingletonHelper {
        private static final BillPughSingleton INSTANCE = new BillPughSingleton();
    }
    public static BillPughSingleton getInstance() {
        return SingletonHelper.INSTANCE;
    }
}

另附:Java23种设计模式(参考JAVA设计模式总结之23种设计模式)
Java设计模式之单例模式的实现_第1张图片

你可能感兴趣的:(Java学习)