单例模式的作用就是为全局提供唯一的一个实例,比如我们在应用中通常把用户信息作为单例,因为几乎每个界面都要用到。
单例的优点: 1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例。 2、避免对资源的多重占用。
缺点: 1、单例中没有抽象层,所以不能继承,扩展困难。2.违背单一职责原则。
懒汉式(线程不安全,懒汉的意思就是说当我需要的时候才去创建新的实例,即当外部调用的时候)
public class SingleTon{
private static SingleTon instance;
private SingleTon() {
}
public static SingleTon getInstance {
if(instance == null) {
instance = new SingleTon();
}
return instance;
}
}
饿汉式(线程安全,饿汉指的是不管外部调用与否,在类加载时就把实例创建出来)
public class SingleTon{
private static SingleTon instance = new SingleTon();
private SingleTon() {
}
public static SingleTon getInstance {
return instance;
}
}
双重检查式(防止多线程同时创建多个实例)
public class SingleTon{
private static SingleTon instance;
private SingleTon() {
}
public static SingleTon getInstance {
if (instance == null){
synchronized (SingletTon.class){//同步防止多线程进入
if (instance == null){
instance = new SingleTon();
}
}
}
}
}
静态内部类(线程安全)
public class SingleTon{
private SingleTon() {
}
public static SingleTon getInstance {
return SingleTonHolder.instance;
}
private static class SingleTonHolder{
private static SingleTon instance = new SingleTon();
}
}
为什么内部可以实现呢?其实就是加载一个类时,其内部类不会同时被加载。一个内部类被加载,当且仅当其某个静态成员(静态域、构造器、静态方法等)被调用时发生.