why
有些对象我们只需要一个,比如:
配置文件、工具类、线程池、缓存、日志对象等
如果创造出多个实例,就会导致许多问题,比如占用过多资源,不一致的结果等
我们要怎么保证整个应用中某个实例有且只有一个,那么我们就要使用单例模式来实现。
饿汉模式
package Singleton;
/*
* 单例模式Singleton
* 应用场合:有些对象只需要一个就足够了,如古代皇帝、老婆
* 作用:保证整个应用程序中某个实例有且只有一个
* 类型:饿汉模式、懒汉模式
*/
public class Singleton {
//1.将构造方法私有化,目的:不允许外部直接创建对象
private Singleton(){
}
//2.创建类的唯一实例,使用private static修饰----
//在其他类中创建多个Singleton.instance实例,其实是一个保证唯一
private static Singleton instance=new Singleton();
//3.提供一个用于获取实例的方法,使用public static修饰
public static Singleton getInstance(){
return instance;
}
}
//饿汉模式
Singleton s1=Singleton.getInstance();
Singleton s2=Singleton.getInstance();
//结果是同一实例
if(s1==s2){
System.out.println("s1和s2是同一个实例");
}else{
System.out.println("s1和s2不是同一个实例");
}
- 行代码何时被加载?
静态成员为类所有,当类被加载时,该行代码就会被加载执行,
创建类的唯一实例无论用户是否调用和获取该实例,均已被加载执行了
饿汉模式,用static修饰,静态成员被类所有。
所有在类加载的时候,就被创建。没有吃饱,所有被称作饿汉模式- 实现饿汉模式的类:
因为用了static关键字,把成员设置成类所有,所以在类加载的时候这个成员就声明了
1.把构造函数设置成private(这样外部就不能通过new方法来随意的声明和实现对象实例了)
2.设置一个类的私有成员对象来实现这个类(饿汉模式的时候会在这里初始化对象)
3.实现类的公共Get方法(可以通过类来直接获取对象实例)
- 实现饿汉模式的类: