饿汉模式
首先看一下饿汉模式,当类加载的时候创建新对象
创建两个医院对象,第一次创建,走构造器,需要两秒创建时间,第二次创建,直接返回创建好的对象
// 饿汉模式:类加载的时候创建新对象
Hospital hospital1 = Hospital.getInstance();
Hospital hospital2 = Hospital.getInstance();
System.out.println(hospital2 == hospital1);
医院对象,
public class Hospital {
/**
* 饿汉模式
*/
private static Hospital instance = new Hospital();
private Hospital() {
System.out.println("开始创建医院,需要 2s ");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("创建结束");
}
public static Hospital getInstance() {
return instance;
}
}
输出结果:
只创建一个对象,等待一个线程, == 返回的是 true
懒汉模式:
// 懒汉模式:第一次使用的时候创建对象,此后的访问直接返回创建好的对象
SuperMarket superMarket1 = SuperMarket.getInstance();
SuperMarket superMarket2 = SuperMarket.getInstance();
System.out.println(superMarket2 == superMarket1);
当访问类的时候,如果是第一次访问,对象是 null,此时创建新对象,如果不是第一次访问,也就是对象不为 null,返回创建好的对象。
public class SuperMarket {
/**
* 懒汉模式
*/
private static SuperMarket instance = null;
private SuperMarket() {
System.out.println("开始创建超市,需要 2s ");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("创建结束");
}
public static SuperMarket getInstance() {
if (instance == null) {
instance = new SuperMarket();
}
return instance;
}
}
无论是硬汉还是懒汉,使用的频率不一定,无法说哪个好哪个不好。
单例模式:
单例模式有以下特点:
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
只能有一个实例,所以正常 new 对象其实是在堆开辟两个对象,所以此时在类中定义类变量和类方法,创建对象后返回 类对象,完成只创建唯一实例