java-单例模式:饿汉式与懒汉式模式

饿汉式单例模式

1.空间换取时间的模式

2.在类内实例对象时直接进行初始化,

public class Earth {
//定义私有构造方法,并在构造方法中打印输出“地球诞生”
private Earth(){

}
//定义私有静态类对象并完成实例化
private static Earth earth=new Earth();
//定义公有静态方法返回类内的私有静态对象
public static Earth getEarth(){
return earth;
}
}

 

public class Test {

public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("第一个地球创建中。。。。");
Earth earth1=Earth.getEarth();
System.out.println("地球诞生");
System.out.println("第二个地球创建中。。。。");
Earth earth2=Earth.getEarth();
System.out.println("第三个地球创建中。。。。");
Earth earth3=Earth.getEarth();
System.out.println("问:三个地球是同一个么?");
System.out.println(earth1);
System.out.println(earth2);
System.out.println(earth3);
}
}

 

懒汉式单例模式

1.时间换取空间的模式

2.类内实例对象并不直接进行初始化,直到第一次调用get方法时,才会进行初始化操作

public class Emperor {
//定义私有构造方法
private Emperor(){

}
//定义私有静态类对象
private static Emperor emperor=null;
//定义公有静态方法返回类内的私有静态对象
public static Emperor getEmperor(){
if(emperor==null){
emperor=new Emperor();
}else{
return emperor;
}
return emperor;
}
}
public class Test {

public static void main(String[] args) {
System.out.println("创建1号皇帝对象");
Emperor emperor1=Emperor.getEmperor();
System.out.println("创建2号皇帝对象");
Emperor emperor2=Emperor.getEmperor();
System.out.println("创建3号皇帝对象");
Emperor emperor3=Emperor.getEmperor();
System.out.println("三个皇帝对象依次是:");
System.out.println(emperor1);
System.out.println(emperor2);
System.out.println(emperor3);
}
}

 总结:

1.定义公有静态方法的原因是为了能够在测试类中,通过无需产生对象实例的情况下,完成方法的调用,因此需将方法设置为静态方法。

2.单例模式只能有一个对象是指使用此模式无论创建多少个对象,这些对象都指向同一个堆空间,测试类中,声明了多个对象的引用指向了同一个内存空间。

3.饿汉式:加入final对于模式实现无影响

懒汉式:加入final会产生百衲衣报错,提示信息为:无法对final修饰的成员及逆行操作

原因:final修饰的静态成员,如果在定义时未进行实例化,则需要在静态代码块中去实现,而不能在类方法中进行实例化。

应用层面:如果饿汉式的程序代码中,不仅涉及创建对象及返回的功能,还包括其他功能,例如资源回收等,就不能加入final修饰,否则会影响程序功能实现。

 

posted @ 2023-12-28 19:13  她的回眸一直很美  阅读(63)  评论(0)    收藏  举报