单例设计模式
- 解决问题:可以保证一个类在对象中唯一性
- 必须对于多个实例使用同一个配置信息对象时,就需要保证该对象唯一性
如何保证对象唯一性?
- 不允许其他程序使用new创建对象
- 在该类创建一个本地实例
- 对外提供一个方法让其他程序可以获取该对象
步骤:
- 私有化该类构造函数
- 通过new在本类中创建一个本类对象
- 定义一个公有的方法,将创建的对象返回
饿汉式
代码展示
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16//饿汉式
public class Single {
//类加载进来时,对象就已经生成了
private static Single s = new Single();
private Single(){}
public static Single getInstance(){
return s;
}
}
public class Demo{
`public static void main(String[] args){
Single s1 = Single.getInstance();
Single s2 = Single.getInstance();
System.out.println(s1 == s2);
}
}工作中常常使用的一种单例模式,安全性好
懒汉式
代码展示
1
2
3
4
5
6
7
8
9
10
11
12// 懒汉式
public class Single2 {
//类加载时没有对象生成,只有调用了getInstance方法后才会创建对象
//延迟加载程序
private static Single2 s = null;
private Single2(){}
public static Single2 getInstance(){
if(s==null)
s = new Single2();
return s;
}
}常见于面试中,涉及知识点较多
内存图示(饿汉式为例)
- main进栈,s1对象生成,方法区,single构造函数进入,静态区,single s getInstance进入,堆中开辟一块空间,赋予0x0045地址,静态区中s指向堆中地址。get方法进栈,s1地址指向0x0045,get出栈。