今天我们来说一说Java中23种设计模式中的单例设计模式:
其实单例设计模式很好理解,保证一个类只能存在一个对象
先看一段代码(不存在单例模式)
public class Single{
public static void main(String[] args){
Student s1 = new Student();
Student s2 = new Student();
s1.setAge(10);
System.out.println(s2.getAge());
}
}
class Student{
private int age;
public void setAge(int age){
this.age=age;
}
public int getAge(){
reutrn age;
}
}
代码分析:很显然结果是0。因为这段代码没有用到单例模式,所以是可以存在多个对象的。s1和s2是堆中的两个对象,指向栈中不同的内存地址。所以给s1赋值,而底层s1和s2是两个对象,所以s2的值依旧是0。
再看这段代码(使用了单例模式)
public class Single{
public static void main(String[] args){
Student s1 = Student.getStudent();
Student s2 = Student.getStudent();
s1.setAge(10);
System.out.println(s2.getAge());
}
}
class Student{
private int age;
public void setAge(int age){
this.age=age;
}
public int getAge(){
return age;
}
private Student(){}
private static Student s = new Student();
private static Student getStudent(){
return s;
}
}
代码分析:这段代码的结果是10.以为这段代码使用了单例模式,使用单例模式就是只存在一个对象,所以这里的s1和s2底层是一个对象,所以给s1赋值就是给s2赋值,所以输出的是10.这里可能就有人要问问什么在Student类中为什么要用静态的方法。我们都知道调用类中的方法,可以是用“引用.”是调用,也可以是静态方法,用“类名.”去调用,这里显然没有对象,只能用类名去调了。
我们来总结一下单例模式的步骤:
1.将构造方法私有化
2.在类中创建一个本类对象
3.对外提供一个方法可以获取到该类对象
接下来我们来说一下单例模式里面的恶汉式和懒汉式
饿汉式:
先看一下下面的这段代码:
private Student(){}
private static Student s = new Student();
private static Student getStudent(){
return s;
}这段代码用到了饿汉式,先初始化对象
Student类一进内存,就已经创建好对象了
懒汉式:
先看看下面的代码:
private Single(){}
private static Single s = null;
public static Single getInstance(){
if(s==null){
s = new Single();
}
return s;
}
这段代码用到了懒汉式,对象是方法被调用时,才初始化,也叫做对象的延时加载
Student类进内存,对象还没有存在,只有调用了getStudent方法时,才建立对象