《Java中的单例模式--两种》

  1 //单例模式:饿汉式和懒汉式
  2 //单例模式
  3 
  4 /*
  5 设计模式:解决某一类问题行之有效的解决办法(思想)。
  6 单例(Singleton):设计模式:
  7 学习设计模式必须先弄清楚它是解决什么问题的。
  8 
  9 单例模式是解决什么问题的?
 10 可以保证一个类的对象唯一性。
 11 
 12 场景:比如多个程序都要使用一个配置文件中的数据,而且要实现
 13       数据共享和交换。必须要将多个数据封装到一个对象中。而且
 14       多个程序操作的是同一个对象。那也就是说必须保证这个配置
 15       文件的唯一性。
 16 
 17 怎么能保证对象的唯一性呢?
 18 1,一个类只要提供了构造函数就可以产生多个对象,
 19   完全无法保证唯一。
 20 既然数量不可控,干脆,不让其他程序建立对象。
 21 
 22 2,不让其他程序创建对象,对像何在?
 23    干脆,自己在本类中创建一个对象,这样好处是什么,可控!.
 24    
 25 3,创建完成后,是不是要给其他程序提供访问的方式。
 26 
 27 怎么实现这个步骤呢?
 28 1,怎么就能不让其他程序创建对象呢?
 29     直接私有化构造函数。不让其他程序创建的对象初始化,这样其他程序就
 30     不能创建对象了,但是在卑劣中还是可以创建本类对象的。
 31 2,直接在本类中new一个本类对象。
 32 3,定义一个功能,其他程序可以通过这个功能获取到本类的对象。
 33 */
 34 //代码体现。
 35 
 36 //【调用方法时,对象已经产生了】
 37 //饿汉式。
 38  class Single
 39 {
 40     //私有化构造函数。
 41     private Single(){}
 42 
 43     //2,创建一个本类对象。
 44     private static /*final*/ Single s = new Single();//因为getInstance方法是
 45                                     //静态的,所以这个方法只能
 46                                     //访问静态的,所以这里必须
 47                                     //加静态关键字修饰。
 48                                     //因为这个对象s是静态的,可以由其他
 49                                     //程序直接有类名调用,但是这样不安全,
 50                                     //对象不可控,所以为了不让其他程序直接
 51                                     //通过类名的方式来调用,加了private
 52                                     //关键字。
 53 
 54     //3,定义一个方法返回这个对象。
 55     public static Single getInstance(int x)
 56     {
 57         //因为这个方法是要返回一个对象,
 58         //就是为了让其他程序获取这个对象的
 59         //所以这个方法的权限要足够大,所以
 60         //为public的。
 61         if(x<0)
 62             return s;
 63         else
 64             return null;
 65     }
 66 }
 67 
 68 //单例的延迟加载方式。(单例:单独的对象)【拿到方法的时候,才产生对象】
 69 //懒汉式。
 70 class Single2
 71 {
 72     private static Single2 s2 = null;
 73 
 74     private Single2(){}//私有化构造函数。
 75 
 76     public static Single2 getInstance()
 77     {
 78         if(s2==null)
 79             s2 = new Single2();
 80         return s2;
 81     }
 82 }
 83 
 84 
 85 class SingleDemo
 86 {
 87     public static void main(String[] args) 
 88     {
 89         //要想获取Single的对象,调用geiInstance方法,
 90         //既然无法通过对象调用,只能用类名调用,那么
 91         //这个方法必须是静态的
 92 
 93         Single ss = Single.getInstance(2);
 94         Single ss2 = Single.getInstance(3);
 95         System.out.println(ss == ss2);//返回true,可以知道ss 和 ss2 指向同一个对象。
 96 
 97         Single2 s = Single2.getInstance();
 98         Single2 s1 = Single2.getInstance();
 99         System.out.println(s == s1);//返回true,可以知道s 和 s1 指向同一个对象。
100     }
101 }
102 
103 /*
104 在饿汉式中可以在本类中创建本类对象时加入final关键字,但是在
105 懒汉式中不可以,试分析其原因。
106 */
原文地址:https://www.cnblogs.com/sun-/p/5450071.html