单例设计模式
一、解决的问题
保证一个类在内存中的对象唯一性。
比如对于多个程序使用同一个配置信息对象时,就需要保证该对象的唯一性。
二、如何保证对象唯一性?
1,不允许其他程序用new创建该类对象。
2,在该类创建一个本类实例。
3,对外提供一个方法让其他程序可以获取该对象。
三、步骤:
1,私有化该类构造函数。(为保证不让其他成员创建该类对象。可将构造函数私有化。)
2,通过new在本类中创建一个【私有并静态】的本类对象。
3,定义一个公有的方法,将创建的对象返回。
例:
1 //饿汉式(开发用的比较多) 2 class Single//类一加载,对象就已经存在了。 3 { 4 private static Single s = new Single(); 5 6 private Single(){} 7 8 public static Single getInstance()//获取实例 *可控*:私有的成员变量s。 9 { 10 return s; 11 } 12 } 13 14 15 //懒汉式(面试考的多)*多线程会出问题* 16 class Single2//类加载进来,没有对象,只有调用了getInstance方法时,才会创建对象。 17 //延迟加载形式。 18 { 19 private static Single2 s = null; 20 21 private Single2(){} 22 23 public static Single2 getInstance() 24 { 25 if(s==null) 26 s = new Single2(); 27 return s; 28 } 29 } 30 31 32 class SingleDemo 33 { 34 public static void main(String[] args) 35 { 36 Single s1 = Single.getInstance(); 37 Single s2 = Single.getInstance(); 38 39 System.out.println(s1==s2); 40 41 // Single ss = Single.s; 42 43 // Test t1 = new Test(); 44 // Test t2 = new Test(); //不能new 45 Test t1 = Test.getInstance();//通过这种方式获取实例 46 Test t2 = Test.getInstance(); 47 t1.setNum(10); 48 t2.setNum(20); 49 System.out.println(t1.getNum()); 50 System.out.println(t2.getNum()); 51 } 52 } 53 54 55 class Test 56 { 57 private int num; 58 59 private static Test t = new Test(); 60 private Test(){} 61 public static Test getInstance() 62 { 63 return t; 64 } 65 public void setNum(int num) 66 { 67 this.num = num; 68 } 69 public int getNum() 70 { 71 return num; 72 } 73 74 }
结果:
true 20 20
说明拿到的实例是同一个。