介绍
单例模式是一种创立型设计模式 ????,可能保障一个类只有一个实例,并提供一个拜访该实例的全局节点。
特点
- 保障一个类只有一个实例。最常见的起因是管制某些共享资源,例如数据库或文件的拜访权限。它的运作形式是这样的,如果此时你创立了一个对象,过一会你决定再创立一个对象,然而此时你会取得方才曾经创立好的对象,而不会产生一个新对象。⚠️ 要留神的是,一般构造函数无奈实现,构造函数的设计决定了它肯定要产生一个新对象。
- 为该实例提供一个全局拜访节点,单例模式容许在程序任何中央拜访特定对象。然而它能够爱护该实例不会被其余代码所笼罩。
解决方案
将默认构造函数设置为公有,避免其余对象应用单例类的 new 关键字进行实例化。
新建一个动态构造方法作为构造函数。该函数会调用公有构造函数来创建对象,无论何时调用该办法,它总是会返回雷同的对象。
public class Singleton {
public static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
...
...
...
}
}
懒汉模式
public static Singleton getInstance() {if (Objects.isNull(instance)) {instance = new Singleton();
}
return instance;
}
这种形式实现起来非常简略,然而如果多线程拜访单例对象,无奈保障线程平安。
public static synchronized Singleton getInstance() {if (Objects.isNull(instance)) {instance = new Singleton();
}
return instance;
}
应用 synchronized 关键字管制多线程拜访,同一时刻只有一个线程能够进入代码块,确保了线程平安。然而这种形式会升高程序运行效率。
public static Singleton getInstance() {if (Objects.isNull(instance)) {synchronized (Singleton.class) {if (Objects.isNull(instance)) {instance = new Singleton();
}
}
}
return instance;
}
应用双重校验的形式,既确保了线程平安,也不会影响程序运行效率。然而有呈现空指针的危险。
public static Singleton getInstance() {return StaticSingletonHolder.INSTANCE;}
private static class StaticSingletonHolder {private static final Singleton INSTANCE = new Singleton();
}
应用动态外部类的形式,确保不会反复创建对象,也不会影响程序效率。并且还是懒加载的形式,内存方面也解决的十分好。
饿汉模式
private static final Singleton INSTANCE = new Singleton();
public static Singleton getInstance() {return INSTANCE;}
应用 final 动态成员变量,当类第一次加载到内存中的时候就实现了初始化,保障了线程平安。
public static SingletonUsingEnum getInstance() {return SingletonUsingEnum.INSTANCE;}
private enum SingletonUsingEnum {INSTANCE;}
应用枚举的形式,能够保障不会反复创建对象,线程平安。还能够防止反射和序列化等带来的问题。是实现单例模式最好的形式。
总结
这是重新学习单例模式的笔记,其中可能有很多中央写的不对,写得不好,欢送大家斧正 ????。