单例模式
单例模式
Ensure a class has only one instance, and provide a global point of access to it.(确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。)
单例模式的优点
- 由于单例模式在内存中只有一个实例,减少了内存开支,特别是一个对象需要频繁的创建和销毁时,而且创建或者销毁时性能又无法进行优化,单例模式的优势就非常明显。
- 由于单例模式只生成一个实例,所以减少了系统的性能开销,当一个对象的产生需要比较多的资源的时候,则可以通过在应用启动时直接产生一个单例对象,然后用永久驻留内存的方式来解决。
单例模式的使用场景
在一个系统中要求一个类有且只有一个对象,如果出现多个对象就会出现“不良反应”,可以采用单例模式,
- 要求生成唯一序列号的环境
- 在整个项目中需要一个共享访问点或共享数据
- 创建一个对象需要消耗过多的资源
- 工具类
单例模式的构建方法
1. 饿汉模式
class Singleton{
// 第一步 构造器私有化
private Singleton(){}
// 第二步 自行对外提供实例
private static final Singleton singleton = new singleton();
// 第三步 提供外界可以获取实例的方法
public static Singleton getInstance(){
return singleton;
}
}
2. 懒汉模式(延迟加载)
class Singleton{
// 第一步 构造器私有化
private Singleton(){}
// 第二步 创建实例的引用
private static final Singleton singleton = null;
// 第三步 提供外界可以获取实例的方法,此时需要判断一下引用的状态。
public static Singleton getInstance(){
if(singleton==null){
singleton = new Singleton();
}
return singleton;
}
}
3. 静态内部类
当一次访问类中的静态字段时,会触发类加载,并且一个类只加载一次。
class Singleton{
// 第一步 构造器私有化
private Singleton(){}
//第二步 创建静态内部类
private static class help{
private static Singleton singleton = new Singleton();
}
// 第三步 提供外界可以获取实例的方法
public static Singleton getInstance(){
return help.singleton;
}
}