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

一、普通情况

正常在实体类下定义一个属性,在测试类中去创建他两次,此时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 static****的 getlnstance****方法,返回自己创建的静态属性
相关推荐
名字还没想好☜6 小时前
Python f-string 进阶:数字格式化、对齐填充、调试 = 号与嵌套表达式
开发语言·数据库·python·字符串格式化·f-string
·薯条大王6 小时前
经济实惠玩云服务器|一台云服务器多人共用,子账号配置教程
java·linux·运维·服务器·汇编·c++·python
一壶浊酒..9 小时前
Scrape Webpack练习
开发语言·javascript·webpack
ZJH__GO9 小时前
网络编程v4pro--实现聊天室文件传输功能
java·服务器·网络·计算机网络
程序员黑豆9 小时前
Windows 系统 Java 环境变量配置全攻略:解决“不是内部或外部命令”
java·前端·ai编程
命运之光10 小时前
【C语言完整代码】就诊信息管理系统
java·c语言·开发语言
凤山老林10 小时前
Spring Boot @Async 线上实战:从默认配置到生产级线程池治理
java·spring boot·后端
命运之光10 小时前
【C语言完整代码】图书管理系统:图书馆场景下的增删改查实战
c语言·开发语言
猿长大人10 小时前
C# | Serilog 新手入门
开发语言·c#·.net·log
marvelyu11 小时前
每天10分钟学会OceanBase系列(Day 20):跨机房容灾实战——构建多数据中心高可用架构
java·大数据·数据库