为什么存在
- 实例化方面:只能对一个对象进行实例化一次
- 加载方面:有些类是不需要实例化多次的,并且这种类在加载时对资源消耗很大,所以考虑单例模式
- 内存方面:节约内存
考虑的条件
如何实现单例模式
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;
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();
}
}
缺点
- 不适用于变化的对象,如果同一类型的对象总是要在不同的用例场景发生变化,单例就会引起数据的错误,不能保存彼此的状态。