欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 养生 > 单例模式(懒汉式、饿汉式)

单例模式(懒汉式、饿汉式)

2024/10/24 12:27:07 来源:https://blog.csdn.net/m0_74249133/article/details/141033443  浏览:    关键词:单例模式(懒汉式、饿汉式)
一、普通情况

正常在实体类下定义一个属性,在测试类中去创建他两次,此时stu1和stu2的内存地址不同

public class Student {private String name;
}
二、单例模式下
(一) 懒汉式
  • 在实体类下设计私有的构造方法,导致在测试类中无法new一个student对象;所以只能通过调用方法得到对象
  • 准备一个类属性,用于指向一个实例化对象,但是暂时指向null private static Student stu;
  • 提供一个公有的方法,第一次访问的时候,发现stu没有指向任何对象,这时实例化一个对象 stu = new Student(); 存在则直接返回当前的stu

在懒汉式下,stu1和stu2的内存地址相同

//代码
public class Student {private static Student stu;private Student(){super();}public static synchronized Student getInstance(){if(stu == null){stu = new Student();}return stu;}
}
(二) 饿汉式
  • 在实体类下设计私有的构造方法,导致在测试类中无法new一个student对象;所以只能通过调用方法得到对象
  • 准备一个类属性,指向一个实例化对象,private static Student stu= new Student();
  • 提供一个公有的方法,直接返回上方定义的对象stu

在饿汉式下,stu1和stu2的内存地址相同

public class Student {private static Student stu = new Student();private Student(){super();}public static synchronized Student getInstance(){return stu;}}
三、测试
//用于测试懒汉式和饿汉式
public class Test01 {public static void main(String[] args) {Student stu1 = Student.getInstance();Student stu2 = Student.getInstance();System.out.println(stu1== stu2);}
}
//懒汉式和饿汉式的结果都为:true//用于测试普通情况
public class Test02 {public static void main(String[] args) {Student stu1 = new Student();Student stu2 = new Student();System.out.println(stu1==stu2);}
}
//结果为:false
四、饿汉式与懒汉式的区别

饿汉式是立即加载的方式,无论是否会用到这个对象,都会加载。如果在构造方法里写了性能消耗较大,占时较久的代码,那么就会在启动的时候时间稍长

懒汉式是延迟加载的方式,只有使用的时候才会加载。 并且有线程安全的考量。使用懒汉式,在启动的时候,会感觉到比饿汉式略快,因为并没有做对象的实例化。 但是在第一次调用的时候,会进行实例化操作,感觉上就略慢。

五、总结

单例模式三要素:

  • 构造方法私有化
  • 静态属性指向实例
  • public staticgetlnstance方法,返回自己创建的静态属性

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com