前言
在枚举中,我们可以让一个类生产固定个数的对象,在进行一步限制,一个类只允许产生唯一的一个对象就实现了单例模式
使用单例模式的目的在于避免频繁创建和销毁实例,减少内存开销
使用场景:
1.要求生产唯一序列号
2.计数器,不用每次刷新都在数据库里加一次,用单例对象先缓存起来
3.连接数据库的对象
使用
步骤
1.定义一个属性,保存当前类的静态对象(单例对象)
2.将构造方法私有化
3.创建一个静态get()方法返回这个单例对象
两种实现方式
懒汉式
创建实例化的过程放在get方法中,当需要单例对象时,调用get()方法才实例化
优点::使用时才创建实例,避免内存浪费
缺点::线程不安全,无法保证绝对的单例(可以加线程锁解决,但会降低执行效率)
public class Master {
private String name;
//懒汉式
private static Master master;
private Master(String name) {
this.name = name;
}
public static Master getMaster(){
if (master==null){
System.out.println("单例对象被创建");
master=new Master("张三");
}
return master;
}
}
测试
Master m1= Master.getMaster();
Master m2= Master.getMaster();
Master m3= Master.getMaster();
结果
单例对象被创建
Process finished with exit code 0
只弹出一次单例对象被创建
饿汉式
直接在属性中实例化,类加载的时候单例对象就准备好了
优点:线程安全,而且执行效率高(使用枚举也可以方便实现单利模式,本质上也是饿汉模式)
缺点:不需要的时候也会创建实例,会导致内存浪费
public class Master2 {
private String name;
//饿汉式
private static Master2 master = new Master2("张三");
private Master2(String name) {
this.name = name;
}
public static Master2 getMaster2(){
return master;
}
}
测试
Master2 m1 = Master2.getMaster2();
System.out.println(m1.toString());
Master2 m2 = Master2.getMaster2();
System.out.println(m2.toString());
Master2 m3 = Master2.getMaster2();
System.out.println(m3.toString());
结果
com.pojo.Master2@4554617c
com.pojo.Master2@4554617c
com.pojo.Master2@4554617c
Process finished with exit code 0