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


    一、普通情况

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

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

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

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

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

    1. public class Student {
    2. private static Student stu = new Student();
    3. private Student(){
    4. super();
    5. }
    6. public static synchronized Student getInstance(){
    7. return stu;
    8. }
    9. }
    三、测试
    1. //用于测试懒汉式和饿汉式
    2. public class Test01 {
    3. public static void main(String[] args) {
    4. Student stu1 = Student.getInstance();
    5. Student stu2 = Student.getInstance();
    6. System.out.println(stu1== stu2);
    7. }
    8. }
    9. //懒汉式和饿汉式的结果都为:true
    10. //用于测试普通情况
    11. public class Test02 {
    12. public static void main(String[] args) {
    13. Student stu1 = new Student();
    14. Student stu2 = new Student();
    15. System.out.println(stu1==stu2);
    16. }
    17. }
    18. //结果为:false
    四、饿汉式与懒汉式的区别

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

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

    五、总结

    单例模式三要素:

    • 构造方法私有化
    • 静态属性指向实例
    • public staticgetlnstance方法,返回自己创建的静态属性
  • 相关阅读:
    SQLite FTS5 扩展(三十)
    代码随想录刷题|买卖股票问题的总结
    MySql(44)事务的基本认识
    贪心算法 Heidi and Library (easy)
    8、在一个数组中找出和为n的两个数
    IP地址与在线教育平台资源分配优化
    Netty 学习(三):通信协议和编解码
    如何制作资产编号标签
    数字信号处理-08-FIR IP应用实例
    docker基础篇:安装tomcat
  • 原文地址:https://blog.csdn.net/m0_74249133/article/details/141033443