版权声明:欢迎转载,转载请注明出处哦! https://blog.csdn.net/qq_41647999/article/details/83447936
目录
什么是单例模式(Singleton)?
设计模式:Java中,一共有23种设计模式,说白了就是比较牛的代码设计思想。单例模式里面非常简单的一种。
比如说windows的桌面回收站,只能打开这么一个回收站的界面,不能打开第二个界面。具体细节,我会拿出实例代码来详细阐述。
一、 懒汉模式
1、 实例
public class Singleton {
//在单例类的内部创建一个自己本身的对象
private static Singleton s=new Singleton();
//获得单例的对象
public static Singleton getSingleton(){
return s;
}
//构造器的私有化
private Singleton(){
}
}
class TestDemo{
public static void main(String[] args) {
Singleton s1= Singleton.getSingleton();
System.out.println(s1);
//测试是否引用的是否是同一个对象
Singleton s2= Singleton.getSingleton();
System.out.println(s2);
Singleton s3= Singleton.getSingleton();
System.out.println(s3);
}
}
运行结果
总结:说明引用的都是同一个对象,这就是单例模式。下面分析一下原理。
2、 原理
其实这就是一个静态属性的生命周期。
因为构造器(就是构造函数)是空的,所以在堆中new Singleton只有一个地址,数据共享区的Singleton定义的s也有地址,指向堆中的0x999;当调用getSingleton()这个方法的时候,getSingleton就进栈产生一个地址,在getSingleton()执行完之后,返回了一个对象s(请看上方代码return s; ),s正好又是new Singleton()地址(请看上方代码private static Singleton s=new Singleton();)。所以在TestDemo中的s1的地址就会指向new Singleton的地址,在下面继续s2、s3的时候,都会拿到一个相同的地址。
二、 饿汉模式
1、 实例
public class Singleton {
//在单例类的内部创建一个自己本身的对象
private static Singleton s;
public static Singleton getSingleton(){
if (s == null){
s=new Singleton();
return s;
}
return s;
}
//构造器的私有化
private Singleton(){
}
}
class TestDemo{
public static void main(String[] args) {
Singleton s1= Singleton.getSingleton();
System.out.println(s1);
}
}
对比一下“懒汉模式”突然发现,“饿汉模式”巧妙的节省了资源。