单例的饿汉与懒汉模式
程序员文章站
2022-03-07 20:03:20
...
单例模式
一个类只创建一个实例,每次都获取的同一个对象
单例模式分为饿汉模式和懒汉模式
单例模式的三要素:
1、构造方法私有化
2、静态属性指向实例
3、public static 的xx方法要返回实例
饿汉模式
立即加载,无论是否用到这个对象都会加载
无论如何都会创建一个对象
启动的时间较长,使用的时候较快
public class Hunger {
/**
* 单例模式:一个类只创建一个实例。每次都获取同一个对象
* 饿汉单例模式:无论如何都会创建一个对象
*/
//私有化构造方法,使得该类无法在外部通过new来实例化
private Hunger() {
}
//用new来实例化 一个对象
public static Hunger show = new Hunger();
//public static 来提供给调用者new的对象
public static Hunger getShow() {
return show;
}
}
public class HungerTest {
public static void main(String[] args) {
//直接创建对象会报错
//Hunger h = new Hunger();
//只能通过Hunger中的getShow来获取对象
Hunger h1 = Hunger.getShow();
Hunger h2 = Hunger.getShow();//h1,h2都是同一个对象
System.out.println(h1==h2);
}
}
//结果为:true
懒汉模式
延迟加载,只有在使用的时候才加载
只有在调用方法的时候才创建实例
启动快,第一次使用的时候慢
public class Lazy {
/**
* 单例模式:一个类只创建一个实例
* 懒汉模式:只有在调用方法的时候才创建实例
*/
//私有化构造函数,使它不能通过new来创建实例
private Lazy() {
}
//准备一个实例化属性,指向null
public static Lazy show;
//public static 方法,返回实例对象
public static Lazy getShow() {
//判断实例是否为空,如果为空就创建实例
if(null == show) {
show = new Lazy();
}
//返回实例指向的对象
return show;
}
}
public class LazyTest {
public static void main(String[] args) {
Lazy l1 = Lazy.getShow();
Lazy l2 = Lazy.getShow(); //l1,l2都是同一个对象
System.out.println(l1==l2);
}
}
//结果为:true
当有充分的启动和初始化的时间时,使用饿汉模式,否则使用懒汉模式
上一篇: Pow(x, n)(快速幂+迭代实现)