设计模式-单例模式
单例模式
懒汉模式
class LazySingleton {
//volatile 防止指令重排
private volatile static LazySingleton lazySingleton;
//私有化构造方法
private LazySingleton(){
//不能防止反射机制创建对象的攻击
....................
}
//提供公共的实例化方法
public static LazySingleton getInstanece(){
if (lazySingleton == null){
//解决多线程安全问题
synchronized (LazySingleton.class){
//双重判断
if (lazySingleton == null){
lazySingleton = new LazySingleton();
}
}
}
return lazySingleton;
}
}
饿汉模式
class HungrySingleton{
//通过类的加载 创建单个实例
private static HungrySingleton instance = new HungrySingleton();
private HungrySingleton(){
//防止通过反射机制攻击单例模式
if (instance != null){
throw new RuntimeException("单例模式不能创建多个实例");
}
}
public static HungrySingleton getInstance(){
return HungrySingleton.instance;
}
}
静态内部类
class InnerSingleton {
private InnerSingleton() {
//防止通过反射机制创建实例改变单例模式的攻击
if(InnerSingletonHolder.instance != null){
throw new RuntimeException("单例模式不能创建多个实例");
}
}
//静态内部类
private static class InnerSingletonHolder {
//通过虚拟机类加载的方式保证单例
private static InnerSingleton instance = new InnerSingleton();
}
//只有调用InnerSingleton.getInstance方法的时候才会创建实例(实际也是懒加载的一种方式)
public static InnerSingleton getInstance() {
return InnerSingletonHolder.instance;
}
}
枚举类实现单例模式
enum EnumSingleton {
SINGLETON;
public void print(){
System.out.println(this.hashCode());
}
}
//调用方式
EnumSingleton.SINGLETON.print();