设计模式->单例模式

118 阅读1分钟

为什么存在

  • 实例化方面:只能对一个对象进行实例化一次
  • 加载方面:有些类是不需要实例化多次的,并且这种类在加载时对资源消耗很大,所以考虑单例模式
  • 内存方面:节约内存

考虑的条件

  • 懒加载
  • 线程安全
  • 反射破坏

如何实现单例模式

  • 饿汉式 实现简单
public class Singleton {
	private Singleton (){}
    public Singleton  instance = new Singleton ();
    public Singleton  getInstance(){
    	retrun instance;
    }
}
  • 懒汉式 线程不安全
public class Singleton {
	private Singleton (){}
    public Singleton  instance = null;
    public Singleton  getInstance(){
    	instance = new Singleton ();
    	retrun instance;
    }
}
  • 双检测 懒加载-线程安全-会被反射破坏(人为)
public class Singleton {
	private Singleton (){}
    public volatile Singleton  instance = null; //volatile防止指令重排
    public Singleton  getInstance(){
    	if(instace == null){
        	syschronized(instance){
            	if(instance == null){
                	instance = new Singleton ();
                }
            }
        }
 		retrun instance;   	
    }
}
  • 静态内部类 懒加载-线程安全-会被反射破坏(人为)
public class Singleton {
	private static class Instance{
    	private stactic Singleton  instance = new Test();
    }
	private Singleton (){}
    public Singleton getInstance(){
 		retrun Instance.instance;   	
    }
}
  • 枚举 保证了反射破坏的情况
public enum Singleton {
    INSTANCE;
    public void doSomething() {
        System.out.println("doSomething");
    }
}
//调用方法
public class Main {
    public static void main(String[] args) {
        Singleton.INSTANCE.doSomething();
    }
}

缺点

  • 不适用于变化的对象,如果同一类型的对象总是要在不同的用例场景发生变化,单例就会引起数据的错误,不能保存彼此的状态。