单例模式

  1. 核心原理:
    • 构造函数私有化
    • 通过静态方法获取唯一实例
  2. 优点
    • 在内存中只有一个实例,减少内存开支与系统性能开销
    • 避免对资源的多重占用
    • 全局访问
  3. 缺点
    • 一般没有接口,扩展困难,需要修改代码
    • 单例如果持有Context,容易引发内存泄漏。如果必须持有一般是用Application

饿汉模式

public class Singleton{
    private static Singleton sInstance = new Singleton();
    private Singleton(){}
    public static Singleton getInstance(){
        return sInstance;
    }
}

懒汉模式

public class Singleton{
    private static Singleton sInstance = null;
    private Singleton(){}
    public static synchronized Singleton getInstance(){
        if(sInstance == null){
            sInstance = new Singleton();
        }
        return sInstance;
    }
}

双检测锁定模式

jdk1.5以上有volatile关键字,低版本可能出现DCL失效

public class Singleton{
    private static volatile Singleton sInstance = null;
    private Singleton(){}
    public static Singleton getInstance(){
        if(sInstance == null){
            sychnorized(Singleton.class){
                if(sInstance == null){
                    sInstance = new Singleton();
                }
            }
        }
        return sInstance;
    }
}

静态内部类**

推荐方式,利用类加载机制

public class Singleton{
    private Singleton(){}
    public static Singleton getInstance(){
        return SingletonBuilder.sInstance;
    }
    
    private static class SingletonBuilder{
        private static final Singleton sInstance = new Singleton();
    }
}

枚举

可避免反序列化时重新生成对象,前面几种方法要避免此情况,可以加入readResolve。

public enum SingletonEnum{
    INSTANCE;
}

容器

如利用hashmap 使用key获取对象等。

你可能感兴趣的:(单例模式)