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修饰,否则会影响程序功能实现。
                    
                
                
            
        
浙公网安备 33010602011771号